正经学徒,佛系记录,不搞事情
概括
多线程经常结合这两个辅助工具类使用,目的都是为了等待多个线程处理完后再继续执行程序,可以简单的理解成 CountDownLatch 是在递减等待,而 CyclicBarrier 是在递增等待
CountDownLatch
//初始化7个,这数值一定要保证最终会被全部减掉
CountDownLatch countDownLatch = new CountDownLatch(7);
for(int i=1;i<=7;i++){
final int temp = i;
new Thread(()->{
System.out.println("已消灭第"+temp+"个bug");
countDownLatch.countDown();//-1操作
}).start();
}
try {
//会阻塞程序,直到countDownLatch减到0后才会继续往下执行
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("bug已全部消灭");
执行结果:
CyclicBarrier
//初始化7个,并在阻塞过后执行runable
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
try {
//为了验证runable先执行还是await后的方法先执行
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("居然有7个bug,准备祭天");
});
for(int i=1;i<=7;i++){
final int temp = i;
new Thread(()->{
System.out.println("发现第"+temp+"个bug");
try {
//+1操作,与CountDownLatch不同,将在线程内阻塞,这也是cyclicBarrier和CountDownLatch不同的使用场景
//直到cyclicBarrier加到7时,先执行完runable的方法后,所有cyclicBarrier.await()全部放行
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("集体祭天:祭天发现第"+temp+"个bug的程序员");
}).start();
}
执行结果: