CyclicBarrier
CyclicBarrier和CountDownLatch功能相似。CyclicBarrier是所有参与线程互相等待对方执行到某点,再一起执行后面程序。
与CountDownLatch一样,CyclicBarrier的构造函数也需要一个int类型的参数
parties,表示参与者数量。每一个线程调用cyclicBarrier对象的await方法就会进入等待。直到参与线程数量到达parties时,唤醒所有线程。
使用例子
场景:所有参与者到位等待,一起开始执行。(比赛参赛选手都到位准备好了,裁判再鸣枪)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for(int i=0 ;i<5;i++){
final int c=i;
new Thread(){
public void run() {
try {
System.out.println(String.format("参与者%d等待",c));
cyclicBarrier.await();
System.out.println(String.format("参与者%d执行",c));
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
执行结果1
2
3
4
5
6
7
8
9
10参与者3等待
参与者1等待
参与者2等待
参与者4等待
参与者0等待
参与者3执行
参与者0执行
参与者1执行
参与者2执行
参与者4执行
CyclicBarrier和CountDownLatch的区别
- CyclicBarrier内部用条件变量Condition实现,会产生上下文切换。CountDownLatch使用共享锁实现。
- CyclicBarrier当parties=0时,在唤醒所有线程同时,还会重置parties。
CountDownLatch不能重置回滚,只能使用一次。
CyclicBarrier使用场景
迭代算法并发化。迭代中,由多个工作线程完成工作。使用await等待所有工作线程完成工作,再将结果作为下一轮迭代的输入。
模拟高并发。保证线程同时开始其操作来模拟高并发测试。