CyclicBarrier 原理和countDownLatch 差不多,都是等大家任务都做完了,再执行下面的步骤。
但是使用上还是有点区别的。
public class Test {
public static void main(String[] args) {
/**
* CyclicBarrier(int parties, Runnable barrierAction)
* parties 是参与线程的个数
* 第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务
**/
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
@Override
public void run() {
System.out.println("all finish ..");
}
});
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("t1 wait");
cyclicBarrier.await();
System.out.println("t1 finish");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
System.out.println("t2 wait");
cyclicBarrier.await();
System.out.println("t2 finish");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
}
}
另外方法中
cyclicBarrier.reset();
1,可以使等待线程打断
2,可以重复使用cyclicBarrier(countdownLatch 就不可以了)