1 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
有很多方法可以解決這個(gè)問(wèn)題,但我建議BlockingQueue
在工作線程和任何其他可以發(fā)出信號(hào)以執(zhí)行其任務(wù)的線程之間使用共享。worker 的任務(wù)被設(shè)置在一個(gè)循環(huán)中,在循環(huán)的頂部它嘗試take()
從隊(duì)列中獲取一個(gè)對(duì)象。這將阻塞,直到某個(gè)其他線程將一個(gè)對(duì)象排入隊(duì)列,該對(duì)象構(gòu)成了信號(hào)。
這種方法的一些優(yōu)點(diǎn)包括:
您可以輕松自然地一次將多個(gè)信號(hào)排隊(duì),這樣如果在發(fā)布信號(hào)時(shí)工作人員實(shí)際上正在工作,則該信號(hào)不會(huì)丟失;
您可以通過(guò)入隊(duì)對(duì)象向工作人員傳達(dá)信息,例如任務(wù)參數(shù)或退出信號(hào)而不是執(zhí)行任何任務(wù);
您有一個(gè)內(nèi)置選項(xiàng)可以在接收信號(hào)時(shí)使用超時(shí);和
所有
BlockingQueue
實(shí)現(xiàn)都是線程安全的,因此您無(wú)需擔(dān)心實(shí)現(xiàn)自己的同步。
示例:
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() {
// ...
}
}
添加回答
舉報(bào)