Java工作线程,终止条件

标签 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.");
}
}

最佳答案

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

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

此方法具有很强的可扩展性,因为您可以用真正的消息队列替换 executorservice。

关于Java工作线程,终止条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772525/

相关文章:

java - µJava不是在杀变种人吗?

c++ - 在不同的线程上解除分配 BSTR 是否安全?

java - 如何将方法从 Array 转移到 ArrayList

java - WindowManagerBadTokenException 无法添加窗口

python - 所有线程均未与QThread以及QtSerialPort(对于Arduino)和Matplotlib一起运行

java - ExecutorService - 如何在其中一个线程发生异常后中断从主线程调用的线程的执行

java - 使用线程同时访问Java同步块(synchronized block)?

c# - Parallel.Foreach 在幕后做了什么?

java - 阅读从 GMail 发送的邮件

java - 当鼠标进入按钮时 jLabel 幻灯片显示