1 回答

TA貢獻1827條經驗 獲得超9個贊
有很多方法可以解決這個問題,但我建議BlockingQueue
在工作線程和任何其他可以發出信號以執行其任務的線程之間使用共享。worker 的任務被設置在一個循環中,在循環的頂部它嘗試take()
從隊列中獲取一個對象。這將阻塞,直到某個其他線程將一個對象排入隊列,該對象構成了信號。
這種方法的一些優點包括:
您可以輕松自然地一次將多個信號排隊,這樣如果在發布信號時工作人員實際上正在工作,則該信號不會丟失;
您可以通過入隊對象向工作人員傳達信息,例如任務參數或退出信號而不是執行任何任務;
您有一個內置選項可以在接收信號時使用超時;和
所有
BlockingQueue
實現都是線程安全的,因此您無需擔心實現自己的同步。
示例:
public OnDemandTask implements Runnable {
private final BlockingQueue<?> signalQueue;
public FeedbackTask(BlockingQueue<?> signalQueue) {
this.signalQueue = signalQueue;
}
@Override
public void run() {
try {
while (true) {
// blocks until an object becomes available from the queue
// may throw InterruptedException
signalQueue.take();
performTask();
}
} catch (InterruptedException ie) {
// we've broken out of the loop; nothing further to do
}
}
private performTask() {
// ...
}
}
添加回答
舉報