Java工作线程,终止条件

时间:2012-12-07 23:13:46

标签: java multithreading

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

2 个答案:

答案 0 :(得分:1)

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

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

此方法具有很高的可伸缩性,因为您可以使用真正的消息队列替换executorservice。

答案 1 :(得分:1)

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