多线程之CountdownLatch

71 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

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...