我的应用程序有1个全局驱动程序,负责做低级别的工作。 然后我有2个线程,这两个线程使用无限循环来完成一些工作。我的问题是如何让1个线程尽可能地使用驱动程序,但给第二个线程在必要时使用它的机会。while while循环等待期间
为了详细说明,我的代码如下:
public class Game {
private static final Object LOCK = new Object();
private static final Logger LOGGER = Logger.getLogger(Game.class);
private WebDriverController controller;
public Game(WebDriverController controler) {
this.controller = controller;
}
public void startThreadA() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (LOCK) {
controller.doSomethingA();
}
}
}
}).start();
}
public void startThreadB() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
...
...
synchronized (LOCK) {
controller.doSomethingB();
}
...
...
}
}
}).start();
}
}
的逻辑是允许第一线程执行doSomethingA()
尽可能,与第二线程只有获取锁来完成的小任务然后将锁返回到第一个线程。
使用此代码,第一个线程将持续使用控制器来完成它需要做的事情,而第二个线程在其同步块中等待。目前我已经解决了这个问题的方法是通过将暂停到第一线,给第二个线程有机会获得锁,如下所示:
public void startThreadA() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (LOCK) {
controller.doSomethingA();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
LOGGER.error(null, e);
}
}
}
}).start();
}
这正好没有工作的打算,但它不” t看起来没错。我对每次迭代后的手动暂停都不满意,尤其是如果第二个线程不需要锁定,因为它浪费了时间。
我该如何更换暂停以提高效率?
如果第二个线程只执行小任务,那么也可以将工作移动到第一个线程中。这将使您的代码更简单,可能更有效。 –
@PeterLawrey任务很小,但有很多。这个想法是,只要第二个线程不需要驱动程序来执行其任务,就允许第一个线程执行。 – Cristian
由于只有一个线程可以持有锁,因此您实际上只能有一个正在运行的线程。除非线程可以并发/独立执行,否则只会增加复杂性。 –