2つのブロッキングキューがある状況があります。最初に、実行するタスクをいくつか挿入します。各タスクが完了すると、タスクが2番目のキューに追加され、そこで実行されます。
したがって、最初のキューは簡単です。空でないことを確認して実行するだけです。それ以外の場合は、interrupt()を実行します。
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();
}
}
あなたが言うことができるように、私が次のことをする2番目のものは機能しません:
public void run() {
try {
SomeTask2 task2 = taskQueue2.take();
doTask(task2);
}
catch (InterruptedException ex) {
}
Thread.currentThread().interrupt();
}
2番目のBlockingQueueがtake()でブロックせず、追加するアイテムがこれ以上ないことがわかった場合にのみ終了するように、どのように解決しますか。2番目のスレッドがおそらく1番目のブロッキングキューを認識し、それが空であり、2番目のキューも空であるかどうかを確認すると、割り込みが発生する可能性があります。
Poisonオブジェクトを使用することもできますが、他のものを使用したいと思います。
注意:これは正確なコードではなく、私がここに書いたものです。