CountDownlatch为JUC下的并发包使用,意为等待同步状态
countDownlatch有参构造方法中传入的参数为等待的次数,以下附上源码解释
想让当前调用await方法时,线程会进入阻塞状态进行等待,只有当count次数为0时才会继续往下运行(调用CountDown方法)
await方法:
当调用await方法时,线程会进入等待状态直到count数量==0
countdown方法:
当吊桶countdown方法时,会让当前count数量-1
附上使用线程池结合countdownlatch的使用
// 用于等待线程同步 CountDownLatch latch = new CountDownLatch(3); ThreadPoolExecutor pool = new ThreadPoolExecutor(4, 4, 1L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1), new ThreadFactoryBuilder().setNamePrefix("countdowntest-").build(), new ThreadPoolExecutor.AbortPolicy()); pool.execute(()->{ log.debug("start.."); sleep(1); latch.countDown(); }); pool.execute(()->{ log.debug("start.."); sleep(1); latch.countDown(); }); pool.execute(()->{ log.debug("start.."); sleep(1); latch.countDown(); }); pool.execute(()->{ try { latch.await(); log.debug("ending.."); } catch (InterruptedException e) { e.printStackTrace(); } });
可以配合线程池使用,等待所有线程准备完毕后再开始
附上结果图
可以看到end结束等待了1s钟,因为每个线程池执行方法时会sleep1秒钟,因为线程时异步执行,所以三个线程几乎是同时执行,总共等待了一秒钟的时间
今日分享到此结束