java - 循环屏障等待方法不起作用

标签 java multithreading

我正在尝试学习多线程,并尝试使用循环屏障。据我所知,要打破屏障,必须通过创建屏障时提到的线程号来调用await 方法。我正在尝试做同样的事情,但是当我检查屏障是否被打破时,我的主要方法将进入无限循环。

class CyclicBarrierTrial implements Runnable{

    CyclicBarrier barrier;
    public CyclicBarrierTrial(CyclicBarrier barrier){
        this.barrier=barrier;
    }

    public void run() {

        System.out.println("in the run method");
        try {
            Thread.sleep(1000);
            System.out.println("going to call awake on barrier"+ Thread.currentThread().getName());

            try {
                barrier.await();
            } catch (BrokenBarrierException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("barrier broke");

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //System.out.println("Wake up from the Sleep"+ Thread.currentThread().getName());
    }

}
<小时/>
public class MYCountDownLatch {

    public static void main(String[] args) throws InterruptedException {

        CyclicBarrier barrier = new CyclicBarrier(2);

        Thread t1= new Thread(new CyclicBarrierTrial((barrier)));
        t1.start();
        Thread t2= new Thread(new CyclicBarrierTrial((barrier)));
        Thread.sleep(2000);
        t2.start();
        while(!barrier.isBroken())
        {
            System.out.println("waiting for the barrier to break "+barrier.isBroken());
        }

        System.out.println("MAIN THREAD  finally barrier to broke ");

    }
}

最佳答案

barrier.isBroken()表示barrier是否处于损坏状态,这与barrier是tripper不同。

要检查这一点,您可以尝试中断其中一个线程,这将在其他线程上引发 BarrierBrokenException 并且 Barrier.isBroken() 将为 true。

  Thread.currentThread().interrupt();

如果你想等待所有线程完成,那么你可以使用ExecutorService.awaitTerminationThread.join

来自documentation : 如果任何线程在等待时被中断,则所有其他等待线程将抛出 BrokenBarrierException 并且屏障被置于损坏状态。

希望这有帮助。

关于java - 循环屏障等待方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871401/

相关文章:

java - NoClassDefFound错误: Maven intermodule dependency

java - 删除 ArrayList 元素时出现 IndexOutOfBoundsException

Java:if、else 和 return

java - 如何正确使用Condition来等待和notifyAll而不丢失通知?

java - 通知后接着另一个通知

multithreading - 并行化 "Reduce"中的 "MapReduce"

用于 Java 的 Linux shell 作业 api

java - 使用 Java 代码向列添加描述

c++ - 为什么我需要在多线程程序中使用 Pthread_sigmask 来确保设置处理程序正在处理信号?

c - 使用C中的线程表示路由表-作业任务