我有一種情況,我有2個阻塞隊列。第一個插入一些我執行的任務。每個任務完成後,它會將任務添加到第二個隊列中,並在其中執行。Java BlockingQueue在take()上阻塞,稍微扭曲
所以我的第一個隊列很簡單:我只是檢查,以確保它不是空的,執行,否則我打斷():
public void run() {
try {
if (taskQueue1.isEmpty()) {
SomeTask task = taskQueue1.poll();
doTask(task);
taskQueue2.add(task);
}
else {
Thread.currentThread().interrupt();
}
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
第二個我這樣做,正如你所知道的,不工作:
public void run() {
try {
SomeTask2 task2 = taskQueue2.take();
doTask(task2);
}
catch (InterruptedException ex) {
}
Thread.currentThread().interrupt();
}
你將如何解決這個問題,使得第二的BlockingQueue不上取(塊),但完成,只有當它知道沒有添加更多的項目。如果第二個線程可能會看到第一個阻塞隊列,並且檢查它是否爲空,並且第二個隊列也是空的,那麼它會很好,然後它會中斷。
我也可以使用Poison對象,但寧願選擇別的。
注意:這不是確切的代碼,只是我在這裏寫下:
我無法弄清楚你在這裏要做什麼。請解釋。 – 2012-01-04 01:05:27