自己动手简单实现CountDownLatch
来源:互联网 发布:奶酪陷阱同款衣服淘宝 编辑:程序博客网 时间:2024/05/24 02:22
在使用线程池的过程中,如何判断所有提交的任务都已经执行完毕了呢?使用jdk自带的CountDownLatch,可以轻松实现这一需求
public class CountdownLatchTest { private static final CountDownLatch countDownLatch = new CountDownLatch(5); public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(10); IntStream.range(0, 5).forEach(i -> { executorService.submit(() -> { try { Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + " " + i); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } }); }); executorService.shutdown(); countDownLatch.await(); System.out.println("All task finished"); }}
执行结果
pool-1-thread-1 0pool-1-thread-5 4pool-1-thread-4 3pool-1-thread-3 2pool-1-thread-2 1All task finished
利用CountDownLatch作为一个计数器,当所有线程完成任务时,调用countDown方法。调用await方法,会阻塞当前线程,直到所有任务都已完成。
所以在输出结果中,All task finished永远在线程任务都完成后。
现在自己简单实现这一功能。
public class CountDown { private final int total; private int count = 0; public CountDown(int count) { this.total = count; } public void countDown() { synchronized (this) { count++; this.notifyAll(); } } public void await() throws InterruptedException { synchronized (this) { while (count != total) { this.wait(); } } }}
定义CountDown类,有两个属性total和count。total记录所有线程的数量,count记录当前完成线程的数量。count和total不相等时,wait,在countdown时唤醒,直到total和count相等时退出循环。
测试
public class CountDownTest { private static final CountDown countDownLatch = new CountDown(5); public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(10); IntStream.range(0, 5).forEach(i -> { executorService.submit(() -> { try { Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + " " + i); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } }); }); executorService.shutdown(); countDownLatch.await(); System.out.println("All task finished"); }}
结果
pool-1-thread-4 3pool-1-thread-3 2pool-1-thread-5 4pool-1-thread-2 1pool-1-thread-1 0All task finished
无论执行多少次,都能保证所有线程都完成任务后在输出打印语句。
阅读全文
0 0
- 自己动手简单实现CountDownLatch
- 闭锁CountDownLatch的简单实现
- 自己动手实现简单权限控制
- 自己动手实现简单权限控制
- 自己动手实现简单权限控制
- 自己动手实现一个简单的String类
- 自己动手实现一个简单的Ajax
- 【自己动手】实现简单的C++ smart pointer
- 【自己动手】实现简单的C++ smart pointer
- 自己动手实现简单的线程池
- 自己动手实现一个简单c编译器
- 自己动手实现简单权限控制_0
- 自己动手实现一个简单的 IOC
- CountDownLatch简单介绍
- CountDownLatch简单实例介绍
- CountDownLatch简单介绍
- CountDownLatch简单使用
- CountDownLatch的简单理解
- 二进制数中返回1的个数的几种方法
- Codeforce 862B Mahmoud and Ehab and the bipartiteness (二分图染色 + 链式前向星)
- 大整数的乘法
- Codeforces 862C
- 基于Spring session 和 redis 的session共享问题
- 自己动手简单实现CountDownLatch
- 如何在Android7.0系统下通过Intent安装apk
- windows下tomcat日志输出至文件
- Microservices From Design to Deployment(中文完整版)
- linux下编译安装apr
- 粒子动画
- cocoapods pod install 报错
- 什么是分布式系统中的幂等性
- linux 部署svn服务器