我有三個工作線程從主線程。主線程將對象放入BlockingQueue。如果隊列沒有足夠的數據,只能說一個對象。其他兩個線程保持等待狀態。如何我信號那些其他兩個等待線程(因爲調用queue.take())終止?Java工作線程,終止條件
這樣做的一種方法是傳遞隊列上的最後一個髒對象以使其他陳舊線程讀取並終止。有沒有其他優雅的解決方案?
public void run() {
if (log.isInfoEnabled()) {
log.info("Entering method 'run' " + this.getName());
}
try {
while (!noMoreData || !queue.isEmpty()) {
String data = queue.take();
...
...
doSomething();
}
if (log.isInfoEnabled()) {
log.info("noMoreData =" + noMoreData + ", queue empty=" + queue.isEmpty() + "....Terminating thread..." + this.getName());
}
} catch (InterruptedException ie) {
log.error(ie);
} finally {
//DONE SIGNAL
doneSignal.countDown();
log.info(this.getName() + " finished.");
}
}
你能描述爲什麼你想過早地結束這個線程而阻塞隊列嗎?通常你會想讓線程正常地死掉,所以我只是好奇你的場景。 –
排隊一個'毒丸'終止請求對象是一個相當常見的技術 - 它足夠優雅,所以爲什麼要使用其他任何東西? –