怎么保证在多线程任务都执行完后再执行某一动作 CountDownLatch
在开发过程当中,我们使用了多线程来异步执行多任务,但是我们想在这些任务执行完成后,才接着再执行的话,就需要使用到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相关推荐
- c#中等待某个线程执行完后再执行某个线程
在方法的外部申请一个这样的变量 CountdownEvent latch = new CountdownEvent(3); 比如现在执行的是方法a public void a() { int si=0 ...
- Vue父组件mounted执行完后再执行子组件mounted执行顺序问题
文章目录 一.vue加载顺序? 二.父组件和子组件 1.封装ip地址框 2.前端从数据库取数据并且赋值 bug 解决方案 一.vue加载顺序? 父组件 created 子组件 created 子组件 ...
- Java多线程面试题之如何让主线程等子线程执行完之后再执行
问题描述 现在有一个主线程X,和两个子线程A和B,A和B之间没有依赖关系且两者的执行时间不确定,现在要求如下: 1:不限制A和B执行顺序的 2:主线程X需要在子线程A和B执行完成之后再执行 方案1 1 ...
- 如何让主线程等待子线程执行完毕后再执行
总结三个方法: (1)join方法,直接将每个线程都join进去即可. (2)countdownlatch,内部维持一个计数操作,通过cas算法保证操作的原子性,当线程执行完之后,调用countDow ...
- 微信小程序 app.js中onLaunch中方法执行完毕后再执行index首页数据请求
实际开发中遇到在app.js中onlaunch中方法未执行完毕的情况下,先进入首页执行index方法的问题.如果在onlaunch中写了自动登录的方法,会存在首页加载时显示未登录的情况(此时onlau ...
- notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象
notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...
- 理解c函数执行完后,释放内存
在C语言中,函数仅仅是一个小的功能块,函数执行完后(也就是函数功能完成),会根据调用约定来释放,该执行函数所占用的内存资源.这里的资源就是执行该函数所占用的栈内存.当函数执行完后仅仅就是释放该函数所用 ...
- vue在一个方法执行完后执行另一个方法
vue在一个方法执行完后执行另一个方法 用Promise来实现. Promise是ES6的新特性,用于处理异步操作逻辑,用过给Promise添加then和catch函数,处理成功和失败的情况 ES7中 ...
- 面试官:如何让主线程等待所有的子线程执行结束之后再执行
java 主线程等待所有子线程执行完毕在执行,在工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总(比如用户下单一个产品,后台会做一系列的处理,为了提高 ...
最新文章
- 一个项目在启动前都应该明确哪些事
- jQuery 之正则表达式篇
- Cetos 7 命令行登陆与图形界面登陆相互切换
- C#中用NPOI的excel导出
- tensorflow 利用索引获取tensor特定元素
- 青蛙跳台阶问题(思路与蜂窝问题一致)
- python含金量最高的考试_中国最难的五大考试,第二个含金量最高,考过年薪30万起!...
- 做网站用UTF-8还是GB2312?
- java 位运算_java学习之运算符与表达式(四)
- java离线语音识别_你家的油烟机,可以语音控制了吗?
- 从Docker在Linux和Windows下的区别简单理解Docker的层次结构
- PHP常用函数之字符串处理
- String:字符串常量池详解
- Eclipse 反编译
- 用CST进行多物理仿真,热仿真结果有误
- 图像插值理论研究——双三次插值(双立方插值)
- POI-HSSFWorkbook合并单元格边框及文字居中问题
- 64位win7系统中vb工程显示加载MSCOMCTL.OCX失败
- 阿里云服务器配置oracle监听
- 废旧手机安装Syncthing作为文件服务器之2-文件同步