我正在尝试学习多线程,并尝试使用循环屏障。据我所知,要打破屏障,必须通过创建屏障时提到的线程号来调用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.awaitTermination或Thread.join
来自documentation : 如果任何线程在等待时被中断,则所有其他等待线程将抛出 BrokenBarrierException 并且屏障被置于损坏状态。
希望这有帮助。
关于java - 循环屏障等待方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871401/