CyclicBarrier 是能循环使用的,调用reset方法就能循环使用
image.png image.png只有await阻塞方法,没有countdownlatch,相当于把countdownlatch的countdown()方法和await()方法组合在一起了
CyclicBarrier 使用场景
我们重新模拟一个新的场景,就用已经被说烂的跑步场景吧,十名运动员各自准备比赛,需要等待所有运动员都准备好以后,裁判才能说开始然后所有运动员一起跑,代码实现如下
public static void main(String[] args) {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(10,()->{
System.out.println("所有人都准备好了裁判开始了");
});
for (int i = 0; i < 10; i++) {
//lambda中只能只用final的变量
final int times = i;
new Thread(() -> {
try {
System.out.println("子线程" + Thread.currentThread().getName() + "正在准备");
Thread.sleep(1000 * times);
System.out.println("子线程" + Thread.currentThread().getName() + "准备好了");
cyclicBarrier.await();
System.out.println("子线程" + Thread.currentThread().getName() + "开始跑了");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
子线程Thread-0正在准备
子线程Thread-2正在准备
子线程Thread-1正在准备
子线程Thread-3正在准备
子线程Thread-4正在准备
子线程Thread-0准备好了
子线程Thread-5正在准备
子线程Thread-6正在准备
子线程Thread-7正在准备
子线程Thread-8正在准备
子线程Thread-9正在准备
子线程Thread-1准备好了
子线程Thread-2准备好了
子线程Thread-3准备好了
子线程Thread-4准备好了
子线程Thread-5准备好了
子线程Thread-6准备好了
子线程Thread-7准备好了
子线程Thread-8准备好了
子线程Thread-9准备好了
所有人都准备好了裁判开始了
子线程Thread-9开始跑了
子线程Thread-0开始跑了
子线程Thread-2开始跑了
子线程Thread-1开始跑了
子线程Thread-7开始跑了
子线程Thread-6开始跑了
子线程Thread-5开始跑了
子线程Thread-4开始跑了
子线程Thread-3开始跑了
子线程Thread-8开始跑了
CountdownLatch 使用场景
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
//lambda中只能只用final的变量
final int times = i;
new Thread(() -> {
try {
System.out.println("子线程" + Thread.currentThread().getName() + "正在赶路");
Thread.sleep(1000 * times);
System.out.println("子线程" + Thread.currentThread().getName() + "到公司了");
//调用latch的countDown方法使计数器-1
latch.countDown();
System.out.println("子线程" + Thread.currentThread().getName() + "开始工作");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
try {
System.out.println("门卫等待员工上班中...");
//主线程阻塞等待计数器归零
latch.await();
System.out.println("员工都来了,门卫去休息了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
子线程Thread-0正在赶路
子线程Thread-2正在赶路
子线程Thread-0到公司了
子线程Thread-0开始工作
子线程Thread-1正在赶路
门卫等待员工上班中...
子线程Thread-4正在赶路
子线程Thread-9正在赶路
子线程Thread-5正在赶路
子线程Thread-6正在赶路
子线程Thread-7正在赶路
子线程Thread-8正在赶路
子线程Thread-3正在赶路
子线程Thread-1到公司了
子线程Thread-1开始工作
子线程Thread-2到公司了
子线程Thread-2开始工作
子线程Thread-3到公司了
子线程Thread-3开始工作
子线程Thread-4到公司了
子线程Thread-4开始工作
子线程Thread-5到公司了
子线程Thread-5开始工作
子线程Thread-6到公司了
子线程Thread-6开始工作
子线程Thread-7到公司了
子线程Thread-7开始工作
子线程Thread-8到公司了
子线程Thread-8开始工作
子线程Thread-9到公司了
子线程Thread-9开始工作
员工都来了,门卫去休息了
网友评论