我有一种情况,我有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