1

我有来自主线程的三个工作线程。主线程将对象放入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.");
}
}
4

2 回答 2

1

您应该使用配置的队列(大小和数据结构)来使用 ExecutorService。

然后,您将收到一条关闭消息 (Runnable),将其提交给调用 #shutdown() 的 executorservice。只需在队列中最后提交该消息即可。

这种方法非常可扩展,因为您可以用真正的消息队列替换 executorservice。

于 2012-12-07T23:44:38.403 回答
1

Thread.interrupt() 会满足您的需求吗?如果保留对三个线程的引用,则可以中断另外两个线程,从而导致 take() 方法抛出 InterruptedException。

于 2012-12-07T23:44:52.510 回答