技术问答-15
16lz
2021-04-14
CountDownLatch
CountDownLatch 也是并发包里的一个类
我理解的它的做用是监控线程执行状态,如果在主线程中启动了三个线程 A B C
我想等A B C 都执行完之后 才执行主线程后边的某段代码 我们当然可以用join 把线程join到我们的主线程中 按顺序执行 但是这就成了单线程了 这个时候我们就需要CountDownLatch
1. countDown
一个线程执行完之后 调用countDown CountDownLatch的总数标记就会-1(当然不是仅仅-1 这么简单 里边设计很多复杂内容 但是可以理解为-1 )
2. await
主线程调用await 会等待CountDownLatch的标记变为0(不是变为0这么简单 这里暂且可以理解成变为0 因为变为0意思就是A B C 线程都执行了countDown )
2. await(long timeout, TimeUnit unit)
与await 类似 只是加了时间参数 如果在这个时间没有执行完A B C 那么就失败
package test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {CountDownLatch cdl = new CountDownLatch(3);new MyThread(cdl).start();new MyThread(cdl).start();new MyThread(cdl).start();System.out.println("等待子线程执行完.....");try {cdl.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("子线程执行完了 执行主线程任务.....");}}class MyThread extends Thread {CountDownLatch cdl;public MyThread(CountDownLatch cdl) {this.cdl = cdl;}@Overridepublic void run() {// 执行任务for (int i = 0; i < 4; i++) {try {System.out.println(this.getName() + "线程执行任务");TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}// 任务执行完成之后 执行countDown 让标记-1System.out.println(this.getName() + "执行结束");cdl.countDown();}}
输出结果为:
Thread-0线程执行任务Thread-2线程执行任务Thread-1线程执行任务等待子线程执行完.....Thread-1线程执行任务Thread-2线程执行任务Thread-0线程执行任务Thread-2线程执行任务Thread-1线程执行任务Thread-0线程执行任务Thread-1线程执行任务Thread-2线程执行任务Thread-0线程执行任务Thread-2执行结束Thread-0执行结束Thread-1执行结束子线程执行完了 执行主线程任务.....
我们可以看到 子线程还是以多线程的方式执行,但是主线程是在等子线程全部执行完之后才执行的主线程任务
这里的关键是需要共享一个CountDownLatch 用了一个有参的构造函数 传递给没个线程
我对她的理解就是这样 欢迎不出 质疑
©著作权归作者所有:来自51CTO博客作者木子的昼夜的原创作品,如需转载,请注明出处,否则将追究法律责任更多相关文章
- RHEL 7.X 或CentOS 7 安装 11.2.0.4 RAC碰到的问题
- MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结
- 我们可以控制你看到的内容:主流IPTV远程代码执行漏洞分析
- 如果使用的库不支持异步,可以使用多进程并将其转化为异步对象
- 【linux】循序渐进学运维-基础篇-at命令
- java使用ganymed-ssh2如何远程执行多条命令
- Java 线程池 ThreadPoolExecutor -01
- java do{} while()
- 20-2 orm分组和聚合以及在项目中执行的一些方法