CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒

CountDownLatch的使用与线程阻塞
博客介绍了CountDownLatch的使用,构造对象时需传入参数N,end.await()可阻塞线程,直到调用N次end.countDown()方法才释放线程,且end.countDown()可在多线程中调用,调用次数为所有线程调用次数总和。

 1、CountDownLatch end = new CountDownLatch(N); //构造对象时候 需要传入参数N

  2、end.await()  能够阻塞线程 直到调用N次end.countDown() 方法才释放线程

  3、end.countDown() 可以在多个线程中调用  计算调用次数是所有线程调用次数的总和
 

https://blog.youkuaiyun.com/u011441473/article/details/103072449

### Java 中 `CountDownLatch` 类的 `countDown()` 方法使用教程 #### 创建并初始化 `CountDownLatch` 为了理解如何使用 `countDown()` 方法,先要创建一个 `CountDownLatch` 对象,并指定计数器初始值。这个数值代表需要等待的任务数量。 ```java final CountDownLatch latch = new CountDownLatch(5); ``` 此代码片段展示了带有参数 5 的构造函数调用,意味着有五个线程或任务需完成之后才能继续执行后续操作[^1]。 #### 实现可运行的任务 定义实现了 `Runnable` 接口的任务类,在其 `run()` 方法内放置具体业务逻辑以及对 `latch.countDown()` 调用: ```java public class Worker implements Runnable { private List<String> outputScraper; private CountDownLatch countDownLatch; public Worker(List<String> outputScraper, CountDownLatch countDownLatch) { this.outputScraper = outputScraper; this.countDownLatch = countDownLatch; } @Override public void run() { doSomeWork(); outputScraper.add("countDown"); countDownLatch.countDown(); // 减少计数器 } } ``` 每当某个子任务结束时就会触发一次 `countDown()` 来减少同步辅助类内部维护的一个整型变量——即最初设定好的计数值。当该值变为零时表明所有预期中的事件均已发生完毕。 #### 提交多个任务给线程池 通过循环向线程池提交若干个上述自定义类型的实例作为新启动的工作单元;每提交一个就相当于增加了一个待处理项到倒计时锁存器里去监控它们的状态变化情况: ```java ExecutorService service = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; ++i) { service.submit(new Worker(outputList, latch)); } ``` 这里利用了固定大小为五的线程池来异步执行由 `Worker` 构造出来的对象所表示的操作序列。每次调用 `submit()` 都会使得关联着当前上下文环境下的那个共享资源(也就是之前声明过的 `latch` 变量)里的剩余数目减掉相应的份额直到最终归零为止[^3]。 #### 主线程阻塞直至所有工作完成 最后一步是在主线程中调用 `await()` 方法使程序暂停在此处而不会立即退出,而是耐心地等着其他地方发出的通知信号告知可以安全前进下去了: ```java try { latch.await(); // 等待所有的子线程都完成了自己的使命 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 所有的子线程都已经结束了各自的任务... System.out.println("All threads have finished their work."); service.shutdown(); ``` 一旦到达此处就意味着已经没有任何活跃状态下的后台进程正在占用 CPU 时间片做事情了,因此接下来就可以放心大胆地释放相关联的各种计算资源并且正常终止应用程序流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值