多线程CountDownLatch和Join
如果现在有五个线程A、B、C、D、E,请问如何用E线程用于统计A、B、C、D四个线程的结果?
题意需要用E线程统计A、B、C、D四个线程,也就是说E线程必须要等到前面四个线程运行结束之后才能执行。那么如何使用E线程来统计前面四个线程的结果呢?
下面介绍两种实现方法:
一、CountDownLatch
CountDownLatch是一种java.util.concurrent包下一个同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。
我们可以将CountDownLatch看作一个计数器,可以给定其一个数来对其进行初始化。当它计数的值变为0时,才可以执行后续的步骤。
public CountDownLatch(int count)
CountDownLatch有两个方法是我们常用的:await();和countDown();
await()函数用于阻塞当前线程直到CountDownLatch的计数值变为0;
countDown()方法用于将当前CountDownLatch的计数值减1;
简单的介绍了CountDownLatch的作用和用法之后,我们看下如下的代码:
import java.util.concurrent.CountDownLatch; public class Test1{public static void main(String[] args) throws InterruptedException {int number = 3;CountDownLatch latch = new CountDownLatch(number);for(int i=0;i<3;i++){ThreadDemo demo = new ThreadDemo(latch);demo.start();System.out.println(i);}latch.await();System.out.println("Check it Out");} }class ThreadDemo extends Thread{private CountDownLatch latch;public ThreadDemo(CountDownLatch latch){this.latch = latch;}public void run(){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();} }
我们首先创建了一个CountDownLatch对象给定一个number将其初始化,需要注意的是当前CountDownLatch对象的值减为0之后,该对象便失去了作用。
同时我们提供了继承自Thread的ThreadDemo类,它包含了一个CountDownLatch对象。当我们创建ThreadDemo对象时,会将CountDowmLatch对象注入其中。
在TreadDemo类的run()方法中,我们执行了两步动作:延迟5秒后将CountDownLatch的计数值减1。
在main函数中,我们利用for循环创建了三个ThreadDemo对象并执行他们的run()方法。添加和不添加latch.await()语句将会得到两种执行结果。
1、添加latch.await()语句
执行结果:
0
1
2
Check it Out
我们会发现0 1 2几乎是同时打印出来的,但是“Check it Out”大概等待了5秒左右的时间后才打印,这说明了其实“Check it Out”是等待前面三个线程执行完countDown()方法之后将latch的值减为0之后才执行的。
2、无latch.await()语句
执行结果:
0
1
2
Check it Out
观察运行结果我们会发现,0 1 2和“Check it Out”几乎是同时出现的,也就是说“Check it Out”并没有等待前面三个线程执行完成之后才执行。
CountDowLlatch的用途即是让一组线程先执行,知道countdownlatch对象的计数值到0后,让后续的线程继续执行。
二、join方法实现
事实上,join方法也可以实现同样的效果!代码如下:
import java.util.concurrent.CountDownLatch; public class Test{public static void main(String[] args) throws InterruptedException {int number = 3;CountDownLatch latch = new CountDownLatch(number);ThreadDemo thread1 = new ThreadDemo(1);ThreadDemo thread2 = new ThreadDemo(2);thread1.start();thread1.join();System.out.println("----");thread2.start(); thread2.join();System.out.println("main is end!");} }class ThreadDemo extends Thread{private int number;public ThreadDemo(int number){this.number = number;}public void run(){System.out.println("Thread"+number+" is running");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread"+number+"is end");} }
运行结果如下:
Thread1 is running
Thread1is end
----
Thread2 is running
Thread2is end
main is end!
可以看到thread1阻塞了thread2,只有当thread1和thread2均执行结束后,main方法才能继续执行。如果想要thread1和thread2同时执行的话,只需要做如下简单的变动。
thread1.start(); thread1.join(); thread2.start(); thread2.join();System.out.println("main is end!");
运行结果如下:
Thread1 is running
Thread2 is running
Thread1is end
Thread2is end
main is end!
因此,如果我们需要某些线程等待指定任务执行完毕之后执行,选择join方法也是一种选择;
转载于:https://www.cnblogs.com/cfyrwang/p/6484139.html
多线程CountDownLatch和Join相关推荐
- java多线程中的join方法详解
java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...
- Java多线程神器:join使用及原理
转载自 Java多线程神器:join使用及原理 join() join()是线程类 Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也 ...
- 多线程CountDownLatch
import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch ...
- Python 多线程中的 join() 和 setDaemon()
Demo 是最好的老师!!! 参考链接:Python多线程与多线程中join()的用法 - cnkai - 博客园 知识点一(setDaemon(False)): 当一个进程启动之后,会默认产生一个主 ...
- java多线程中CountDownLatch和join的使用
在工作中,我们经常需要和多线程打交道,简单说明一个场景,在工厂流水线上有2条流水线,流水线同时开工生产零件,但是每个零件生产时间不一样,只有等到两个零件都生产完毕之后才能开始总组装.那我们很快想到jo ...
- JAVA多线程-CountDownLatch计数器
一.概述 CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程执行完操作之后再继续执行.通常用于控制多个线程的执行顺序. 二.基本原理 我们可以把CountDownLatch ...
- JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore
上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...
- JAVA多线程基础篇-join方法的使用
1.概述 join()是Thread类中的一个方法,它的作用是将当前线程挂起,等待其他线程结束后再执行当前线程,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行.通常用于在main主 ...
- Python多线程中阻塞(join)与锁(Lock)的使用误区
参考资料:https://blog.csdn.net/cd_xuyue/article/details/52052893 1使用两个循环分别处理start和join函数.即可实现并发. threads ...
- python 多线程中的 join 和 daemon
文章目录 第一关:简单的 join() 第二关:join(timeout) 第三关:setDaemon(True) 第一关:简单的 join() import threading import tim ...
最新文章
- 根据省市区查询对应权限下的数据
- 牛客小白月赛12 I	华华和月月逛公园 (tarjian 求桥)
- java 获取mp3 id3v2_MP3文件的ID3V1信息与ID3V2信息结构的分析
- 说不尽的嘎达梅林:读郭雪波的长篇小说《青旗•嘎达梅林》
- FPGA(0)--quartusⅡ安装
- java集合数组,数组小到大排序,数组大到小排序
- 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
- python pip使用_Python——pip的安装与使用
- oracle中中文乱码,oracle中文乱码的解决方法
- 苹果cmsv10播放器源码插件
- html获取contextpath,JavaScript中${pageContext.request.contextPath}取值问题及解决方案
- 2021级C语言大作业 - 一笔画
- chinapub读书会第10期:机器学习与人工智能 6月25日相约阿里云+优客工场
- 计算机操作系统——进程调度算法
- Docker安装ELK详细步骤(生产试验,适用所有版本)
- 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...
- HttpClient:connection still allocated.解决方法
- 树的基本概念及表示方法
- 文本编辑器Geany
- 远程办公模式下,如何做好团队管理?
热门文章
- 动画效果之时间轴对象构造器(即逐个执行动画)
- @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
- Java SE 正则表达式 API Pattern 与 Matcher.
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_14-webpack研究-webpack-dev-server...
- 搭建mqtt服务器apollo
- bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
- java课程设计---彩票销售管理系统
- 网上支付(支付宝/银联)
- 图像下方出现几像素的空白间隙
- MySQL INFORMATION_SCHEMA信息数据库