循环障碍等待方法不起作用

时间:2017-08-24 21:47:15

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

    }
}

1 个答案:

答案 0 :(得分:1)

barrier.isBroken()表示屏障是否处于破碎状态,这与屏障是不同的。

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

  Thread.currentThread().interrupt();

如果您想等待所有主题完成,那么您可以使用ExecutorService.awaitTerminationThread.join

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

希望得到这个帮助。