我有一个情况,我有 2 个阻塞队列。首先我插入一些我执行的任务。当每个任务完成时,它会将一个任务添加到第二个队列中,并在那里执行它们。
所以我的第一个队列很简单:我只是检查以确保它不为空并执行,否则我会中断():
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 不会在 take() 上阻塞,但只有在它知道没有更多项目要添加时才完成。如果第二个线程可以看到第一个阻塞队列,并检查它是否为空并且第二个队列也为空,那么它将中断。
我也可以使用 Poison 对象,但更喜欢别的东西。
注意:这不是确切的代码,只是我在这里写的: