在前面一篇博文http://guoba6688-sina-com.iteye.com/blog/724536中提出如何更方便的等待多线程执行结果,该篇博文的做法是
//等待线程执行完毕
while(threadPool.getActiveCount() > 0){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
今天发现java类库中的CountDownLatch可以很方便的完成这个工作
CountDownLatch的原理时
1、先设一个线程数,通过构造函数。
2、启动线程后,调用await()方法等待内部保持的线程数归零
3、每个线程在完成后调用countDown(),将活动的线程数减1
4、当活动线程数归零后,执行下面的代码
附上代码
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* CountDownLatch 的用法
*
* @author 锅巴
* @version 1.0 2010-8-9
*/
public class Main {
private ExecutorService pool;
private int threadCount = 10;
private CountDownLatch countDownLatch;
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
main.execute();
System.out.println("Main is end ");
// System.exit(0);
}
public Main(){
threadCount = 10;
pool = Executors.newFixedThreadPool(threadCount);
//初始化线程数
countDownLatch = new CountDownLatch(threadCount);
}
public void execute() throws InterruptedException{
for(int i=0; i<threadCount; i++){
pool.execute(new Handler(10,countDownLatch));
}
pool.shutdown();
//等待线程执行完成
//实现上是等待count变成0
countDownLatch.await();
}
class Handler implements Runnable {
private int count;
private CountDownLatch countDownLatch;
public Handler(int count,CountDownLatch countDownLatch) {
this.count = count;
this.countDownLatch = countDownLatch;
}
public void run() {
// read and service request
for(int i=0; i<count; i++){
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//当本线程完成就减1
countDownLatch.countDown();
}
}
}
分享到:
相关推荐
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在网上找的一个CountDownLatch的学习demo,感觉很不错,就摘抄过来了
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品需要进行质检,5个工人进行检查,所有...
主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
然后,创建一个固定数量的线程池,使用 CountDownLatch 控制主线程等待所有任务完成;最后,循环迭代分片区间,将分片任务提交到线程池中处理。在每个任务中,使用 ReadRowHolder 对象实现分片读取 Excel 数据,并...
主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 等待多个资源就绪 CountDownLatch与CyclicBarrier的对比 最佳实践与...
CountDownLatch计数器闭锁是一个能阻塞主线程,让其他线程满足特定条件下主线程再继续执行的线程同步工具。 Latch闭锁的意思,是一种同步的工具类。类似于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭着的,不...
浅析Java中CountDownLatch用法 CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。下面以一个模拟运动员比赛的例子加以说明。 ...
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成) 2)CyclicBarrier(循环屏障:同步屏障) 3)Semaphore(信号量:控制并发进程数) 主要参考资料:java并发编程的艺术、Java并发——...
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都到达这个屏障时,所有线程才能继续执行。与CountDownLatch不同的是,...
多线程相关的(具体包括Lock synchronized Join ThreadLocal Executors CountDownLatch等)一些demo。