Java - 优雅地退出线程

标签 java concurrency cyclicbarrier

我有一堆执行计算的线程。它们使用 CyclicBarrier “同步” 。当任何线程的 run()方法完成后,我希望所有其他线程在调用 await() 后也退出下次就在障碍物上。

到目前为止,我尝试过的所有内容都卡在 await()调用或结果导致屏障破裂。有什么建议吗?

编辑:这是(基本)代码:

public MyClass implements Runnable {
    public void run() {
        while (true) {
            if (someCondition) {
                // quit other threads when they call await()
                return;
            }
            barrier.await();
    }
}

最佳答案

reset() 将唤醒所有等待线程并抛出异常

然后你可以像这样使用await

private static volatile boolean shouldStop=false;

public void run() {
    try{
        while (true) {
            if (someCondition) {
                // quit other threads when they call await()
                return;
            }
            try{
                if(shouldStop)return;
                barrier.await();
            }catch(BrokenBarrierException e){
                //someone stopped 
                return;
            }
       }
   }finally{
       shouldStop =true;
       barrier.reset();
   }
}

您还可以调用 if(shouldStop) 检查的方法

关于Java - 优雅地退出线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513041/

相关文章:

c++ - 为什么在以下情况下没有数据竞争?

java - Java 中的多线程控制

java - 何时在 java 多线程中重置 CyclicBarrier

java - 使用信号量在java中实现循环屏障

java - 我如何在 JBoss 中拥有多个具有相同 JNDI 名称的数据源?

java - 如何获取 Spring Batch Job 后的失败次数?

java - Java 的 RSA 算法库

java - 每当线程达到稳定状态时就发出信号终止它

java - 使用 IP 地址访问本地应用程序时出现 404 错误,但在 localhost 上工作正常?

java - 如何限制任务,以便一次只运行一个任务并忽略其余任务