我的應用程序有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
由於只有一個線程可以持有鎖,因此您實際上只能有一個正在運行的線程。除非線程可以併發/獨立執行,否則只會增加複雜性。 –