1. CyclicBarrier
- 和 CountDownLatch 类似
- 线程会等待,直到足够多线程达到了事先规定的数据。一旦触发条件,就可以进行下一步的操作
- 适用于线程之间相互等待处理结果就绪的场景
- CyclicBarrier 可以构造一个集结点,当某一个线程执行完毕,它就会到集结点等待,直到所有线程都到了集结点,那么该栅栏就会被撤销,所有线程再统一出发,继续执行剩下的任务
用法一:等待所有人到达指定地点,再统一出发
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("所有人都到了,大家统一出发");
}
});
for (int i = 0; i < 5; i++) {
new Thread(new Task(cyclicBarrier)).start();
}
}
static class Task implements Runnable {
private final CyclicBarrier cyclicBarrier;
public Task(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " 现在前往集合地点");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(Thread.currentThread().getName() + " 已经到了集合地点,等待其他人到达");
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
用法二:CyclicBarrier简单使用示例
2. CountDownLatch
- 和 CyclicBarrier 类似,数量递减到0时,触发动作
- 但是不可重复使用
主要方法:
- CountDownLatch(int count),仅有一个构造函数,参数 count 为需要倒数的数值
- await(),调用 await() 方法的现场会被挂起,它会等待直到 count 值为0才继续执行
- countDown(),讲 count 值减1,直到为0时,等待的现场会被唤起
用法一:一个线程等待多个线程都执行完毕,再继续自己的工作(一等多)