我有来自主线程的三个工作线程。主线程将对象放入BlockingQueue中。如果队列没有足够的数据,可以说只有一个对象。另外两个线程保持等待状态。如何向其他两个等待线程(因为调用了queue.take())发出终止信号?
实现此目的的一种方法是将队列中的最后一个脏对象传递给其他过时的线程来读取和终止。还有其他优雅的解决方案吗?
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.");
}
}
最佳答案
您应该使用 ExecutorService 使用您配置的队列(大小和数据结构)。
然后,您将收到一条关闭消息(可运行),您可以将其提交给调用 #shutdown() 的 executorservice。只需在队列的最后提交该消息即可。
此方法具有很强的可扩展性,因为您可以用真正的消息队列替换 executorservice。
关于Java工作线程,终止条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772525/