如果现在有五个线程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相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. Java多线程神器:join使用及原理

    转载自 Java多线程神器:join使用及原理 join() join()是线程类 Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也 ...

  3. 多线程CountDownLatch

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch ...

  4. Python 多线程中的 join() 和 setDaemon()

    Demo 是最好的老师!!! 参考链接:Python多线程与多线程中join()的用法 - cnkai - 博客园 知识点一(setDaemon(False)): 当一个进程启动之后,会默认产生一个主 ...

  5. java多线程中CountDownLatch和join的使用

    在工作中,我们经常需要和多线程打交道,简单说明一个场景,在工厂流水线上有2条流水线,流水线同时开工生产零件,但是每个零件生产时间不一样,只有等到两个零件都生产完毕之后才能开始总组装.那我们很快想到jo ...

  6. JAVA多线程-CountDownLatch计数器

    一.概述 CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程执行完操作之后再继续执行.通常用于控制多个线程的执行顺序. 二.基本原理 我们可以把CountDownLatch ...

  7. JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore

    上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...

  8. JAVA多线程基础篇-join方法的使用

    1.概述 join()是Thread类中的一个方法,它的作用是将当前线程挂起,等待其他线程结束后再执行当前线程,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行.通常用于在main主 ...

  9. Python多线程中阻塞(join)与锁(Lock)的使用误区

    参考资料:https://blog.csdn.net/cd_xuyue/article/details/52052893 1使用两个循环分别处理start和join函数.即可实现并发. threads ...

  10. python 多线程中的 join 和 daemon

    文章目录 第一关:简单的 join() 第二关:join(timeout) 第三关:setDaemon(True) 第一关:简单的 join() import threading import tim ...

最新文章

  1. 根据省市区查询对应权限下的数据
  2. 牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)
  3. java 获取mp3 id3v2_MP3文件的ID3V1信息与ID3V2信息结构的分析
  4. 说不尽的嘎达梅林:读郭雪波的长篇小说《青旗•嘎达梅林》
  5. FPGA(0)--quartusⅡ安装
  6. java集合数组,数组小到大排序,数组大到小排序
  7. 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
  8. python pip使用_Python——pip的安装与使用
  9. oracle中中文乱码,oracle中文乱码的解决方法
  10. 苹果cmsv10播放器源码插件
  11. html获取contextpath,JavaScript中${pageContext.request.contextPath}取值问题及解决方案
  12. 2021级C语言大作业 - 一笔画
  13. chinapub读书会第10期:机器学习与人工智能 6月25日相约阿里云+优客工场
  14. 计算机操作系统——进程调度算法
  15. Docker安装ELK详细步骤(生产试验,适用所有版本)
  16. 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...
  17. HttpClient:connection still allocated.解决方法
  18. 树的基本概念及表示方法
  19. 文本编辑器Geany
  20. 远程办公模式下,如何做好团队管理?

热门文章

  1. 动画效果之时间轴对象构造器(即逐个执行动画)
  2. @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
  3. Java SE 正则表达式 API Pattern 与 Matcher.
  4. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_14-webpack研究-webpack-dev-server...
  5. 搭建mqtt服务器apollo
  6. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
  7. java课程设计---彩票销售管理系统
  8. 网上支付(支付宝/银联)
  9. 图像下方出现几像素的空白间隙
  10. MySQL INFORMATION_SCHEMA信息数据库