多线程之CountdownLatch

多线程之CountdownLatch

1 说明

CountdownLatch, 用来进行线程同步协作,等待所有线程完成倒计时.

构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一.

public static void main(String[] args) throws InterruptedException {
     CountDownLatch latch = new CountDownLatch(3);
    
     new Thread(() -> {
         log.debug("begin...");
         sleep(1);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     }).start();
    
     new Thread(() -> {
         log.debug("begin...");
         sleep(2);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     }).start();
    
     new Thread(() -> {
         log.debug("begin...");
         sleep(1.5);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     }).start();
    
     log.debug("waiting...");
     latch.await();
     log.debug("wait end...");
}

运行结果:

08:44:00.778 c.TestCountDownLatch [main] - waiting... 
08:44:00.778 c.TestCountDownLatch [Thread-2] - begin... 
08:44:00.778 c.TestCountDownLatch [Thread-0] - begin... 
08:44:00.778 c.TestCountDownLatch [Thread-1] - begin... 
08:44:01.782 c.TestCountDownLatch [Thread-0] - end...2 
08:44:02.283 c.TestCountDownLatch [Thread-2] - end...1 
08:44:02.782 c.TestCountDownLatch [Thread-1] - end...0 
08:44:02.782 c.TestCountDownLatch [main] - wait end... 

线程池优化

public static void main(String[] args) throws InterruptedException {
     CountDownLatch latch = new CountDownLatch(3);
     ExecutorService service = Executors.newFixedThreadPool(4);
    
     service.submit(() -> {
         log.debug("begin...");
         sleep(1);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     });
    
     service.submit(() -> {
         log.debug("begin...");
         sleep(1.5);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     });
    
     service.submit(() -> {
         log.debug("begin...");
         sleep(2);
         latch.countDown();
         log.debug("end...{}", latch.getCount());
     });
    
     service.submit(()->{
         try {
             log.debug("waiting...");
             latch.await();
             log.debug("wait end...");
         } catch (InterruptedException e) {
         e.printStackTrace();
         }
     });
}

运行结果:

08:52:25.831 c.TestCountDownLatch [pool-1-thread-3] - begin... 
08:52:25.831 c.TestCountDownLatch [pool-1-thread-1] - begin... 
08:52:25.831 c.TestCountDownLatch [pool-1-thread-2] - begin... 
08:52:25.831 c.TestCountDownLatch [pool-1-thread-4] - waiting... 
08:52:26.835 c.TestCountDownLatch [pool-1-thread-1] - end...2 
08:52:27.335 c.TestCountDownLatch [pool-1-thread-2] - end...1 
08:52:27.835 c.TestCountDownLatch [pool-1-thread-3] - end...0 
08:52:27.835 c.TestCountDownLatch [pool-1-thread-4] - wait end... 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值