1. 作用: 各自任务完成之后, 互相等待;所有任务完成之后, 才能继续执行.
public class CyclicBarrierDemo1 {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Thread(() -> {
System.out.println("All finished!");
}));
new Thread(() -> {
System.out.println("T1 in...");
try {
TimeUnit.SECONDS.sleep(1);
cyclicBarrier.await();
System.out.println("T1 finished.");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, "T1").start();
new Thread(() -> {
System.out.println("T2 in...");
try {
TimeUnit.SECONDS.sleep(3);
cyclicBarrier.await();
System.out.println("T2 finished.");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, "T2").start();
}
}
2. CountDownLatch和CyclicBarrier的区别
- countDownLatch不能reset; CyclicBarrier可以reset;所以可以循环使用。
- countDownLatch线程之间互不关心;CyclicBarrier线程必须等到同一个共同点才能执行某个操作。
3. CyclicBarrier的构造函数
- 默认只传入一个整型的wait数量;
- 还可以使用
CyclicBarrier(int num, Runnable action)
:当任务执行完成时, 回调此Action。
public class CyclicBarrierReback implements Runnable {
private CyclicBarrier barrier = new CyclicBarrier(4, this);
public static void main(String[] args) {
new CyclicBarrierReback().barrier();
System.out.println("Main done!");
}
private void barrier() {
ExecutorService executorService = Executors.newFixedThreadPool(4);
IntStream.range(0, 4).forEach(item -> {
executorService.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + " done!");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace();
} });
});
}
@Override
public void run() {
System.out.println("所有任务都执行完成啦");
}
}