CyclicBarrier CountDownLatch 自增与自减

正经学徒,佛系记录,不搞事情

概括

多线程经常结合这两个辅助工具类使用,目的都是为了等待多个线程处理完后再继续执行程序,可以简单的理解成 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 CountDownLatch 自增与自减_第1张图片

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();
}

执行结果:
CyclicBarrier CountDownLatch 自增与自减_第2张图片

你可能感兴趣的:(java)