在开发过程当中,我们使用了多线程来异步执行多任务,但是我们想在这些任务执行完成后,才接着再执行的话,就需要使用到CountDownLatch这个类了。

首先我们需要知道被执行任务的个数,比如这里是有20个任务,那么

CountDownLatch latch = new CountDownLatch(20);

然后在创建任务的时候,把latch带进去,在该任务的run()方法执行完毕后,需要执行latch.countDown()方法。这个countDown()方法就标识这个任务执行完了,总的数量会减1.

这里为了确保任务出异常的时候,任务总数也要减少1,所以需要规范写法:

public class Task implements Runnable {
@Override
public void run() {try{//执行任务}catch(){//处理异常}finally{//任务总数减去1latch.countDown();}
}
}

在外面使用latch.await();来等待全部线程执行完毕,只有全部线程执行完毕后,这里的latch.await()才会往后面执行,不然的话,一直卡在这里。

示例代码:

任务类:

package com.tianrun.utils;import java.util.concurrent.CountDownLatch;public class Task implements Runnable {private int num;//线程计数private CountDownLatch latch;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public Task(int num, CountDownLatch latch) {this.num = num;this.latch=latch;}@Overridepublic void run() {try{if(num==5){throw  new RuntimeException("error");}System.out.println(num);}catch (Exception e){System.out.println(e.getMessage());}finally {latch.countDown();}}
}

调用:

package com.tianrun.utils;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;public class TestThreadCount {public static void main(String[] args) {//这里是所有任务的个数CountDownLatch latch = new CountDownLatch(10);for(int i=0;i<10;i++){//创建任务的时候,把latch也传递进去,反正任务里面执行完毕都会去latch.countDown()Executors.newSingleThreadExecutor().execute(new Task(i,latch));}try {latch.await();System.out.println("test over");} catch (InterruptedException e) {e.printStackTrace();}}
}

怎么保证在多线程任务都执行完后再执行某一动作 CountDownLatch相关推荐

  1. c#中等待某个线程执行完后再执行某个线程

    在方法的外部申请一个这样的变量 CountdownEvent latch = new CountdownEvent(3); 比如现在执行的是方法a public void a() { int si=0 ...

  2. Vue父组件mounted执行完后再执行子组件mounted执行顺序问题

    文章目录 一.vue加载顺序? 二.父组件和子组件 1.封装ip地址框 2.前端从数据库取数据并且赋值 bug 解决方案 一.vue加载顺序? 父组件 created 子组件 created 子组件 ...

  3. Java多线程面试题之如何让主线程等子线程执行完之后再执行

    问题描述 现在有一个主线程X,和两个子线程A和B,A和B之间没有依赖关系且两者的执行时间不确定,现在要求如下: 1:不限制A和B执行顺序的 2:主线程X需要在子线程A和B执行完成之后再执行 方案1 1 ...

  4. 如何让主线程等待子线程执行完毕后再执行

    总结三个方法: (1)join方法,直接将每个线程都join进去即可. (2)countdownlatch,内部维持一个计数操作,通过cas算法保证操作的原子性,当线程执行完之后,调用countDow ...

  5. 微信小程序 app.js中onLaunch中方法执行完毕后再执行index首页数据请求

    实际开发中遇到在app.js中onlaunch中方法未执行完毕的情况下,先进入首页执行index方法的问题.如果在onlaunch中写了自动登录的方法,会存在首页加载时显示未登录的情况(此时onlau ...

  6. notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

    notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...

  7. 理解c函数执行完后,释放内存

    在C语言中,函数仅仅是一个小的功能块,函数执行完后(也就是函数功能完成),会根据调用约定来释放,该执行函数所占用的内存资源.这里的资源就是执行该函数所占用的栈内存.当函数执行完后仅仅就是释放该函数所用 ...

  8. vue在一个方法执行完后执行另一个方法

    vue在一个方法执行完后执行另一个方法 用Promise来实现. Promise是ES6的新特性,用于处理异步操作逻辑,用过给Promise添加then和catch函数,处理成功和失败的情况 ES7中 ...

  9. 面试官:如何让主线程等待所有的子线程执行结束之后再执行

    java 主线程等待所有子线程执行完毕在执行,在工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总(比如用户下单一个产品,后台会做一系列的处理,为了提高 ...

最新文章

  1. 一个项目在启动前都应该明确哪些事
  2. jQuery 之正则表达式篇
  3. Cetos 7 命令行登陆与图形界面登陆相互切换
  4. C#中用NPOI的excel导出
  5. tensorflow 利用索引获取tensor特定元素
  6. 青蛙跳台阶问题(思路与蜂窝问题一致)
  7. python含金量最高的考试_中国最难的五大考试,第二个含金量最高,考过年薪30万起!...
  8. 做网站用UTF-8还是GB2312?
  9. java 位运算_java学习之运算符与表达式(四)
  10. java离线语音识别_你家的油烟机,可以语音控制了吗?
  11. 从Docker在Linux和Windows下的区别简单理解Docker的层次结构
  12. PHP常用函数之字符串处理
  13. String:字符串常量池详解
  14. Eclipse 反编译
  15. 用CST进行多物理仿真,热仿真结果有误
  16. 图像插值理论研究——双三次插值(双立方插值)
  17. POI-HSSFWorkbook合并单元格边框及文字居中问题
  18. 64位win7系统中vb工程显示加载MSCOMCTL.OCX失败
  19. 阿里云服务器配置oracle监听
  20. 废旧手机安装Syncthing作为文件服务器之2-文件同步

热门文章

  1. C# 结构体的创建和使用
  2. 浙江二本计算机学校有哪些,浙江二本大学排名
  3. 02-分类算法:knn、朴素贝叶斯、决策树和随机森林
  4. 细说联想企业网盘背后的安全那些事儿
  5. 携程网呼叫中心落户永川
  6. 【经验分享】大学生英语51汇听答案获取
  7. 从零学ELK系列(十):SpringBoot项目接入ELK升级版(超详细图文教程)
  8. P1428 小鱼比可爱(C语言)
  9. 【渗透测试笔记】之【被动信息收集 】
  10. 重庆大学计算机学院研究员名单,CCF重庆大学学生分会成立