import java.util.concurrent.CountDownLatch;
/**
* 这个适用于等待N个线程执行完任务,再执行另外的线程的任务。
* @author Administrator
*
*/
public class Driver {
private int N = 5;
void test() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);//make sure the "N" equal the number of threads
for (int i = 0; i < N; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
long start = System.nanoTime();// don't let run yet
startSignal.countDown(); // let all threads proce
System.out.println(startSignal.getCount());
doneSignal.await(); // make the main thread wait for all to finish
long end = System.nanoTime();
System.out.println("time = " + (end -start)+"ns "+Thread.currentThread().getName());//所有等待的线程执行完了,才会执行这行语句。
}
public static void main(String ...args){
Driver dr = new Driver();
try{
dr.test();
}catch (Exception e) {
e.printStackTrace();
}
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;//startSignal被多个线程共用
private final CountDownLatch doneSignal;//doneSignal被多个线程共用
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();//使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
doWork();
doneSignal.countDown();//递减锁存器的计数,如果计数到达零,则释放所有等待的线程,执行一次计数器减去1,不会自动减到0
} catch (InterruptedException ex) {} // return;
}
void doWork() {
System.out.println("working..."+Thread.currentThread().getName());
}
}
分享到:
相关推荐
并发编程的一些小示例 1.等待通知的几种方式,包括Object的wait/notify,Condition的await/signal 2. CountDownLatch,统一控制多线程开始和结束 3.原子操作,AtomicXXX 4.线程池
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 下面通过本文给大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友参考下吧
javar的CountDownLatch是个计数器,它有一个初始数,等待这个计数器的线程必须等到计数器倒数到零时才可继续。
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java线程并发工具类CountDownLatch原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在Java中并发协同工具类,以及场景的示例
主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了JAVA CountDownLatch与thread-join()的区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java CountDownLatch的相关资料,文中示例代码非常详细,帮助大家理解和学习,感兴趣的朋友可以了解下
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...
14.6.2 Semaphore与CountDownLatch258 14.6.3 FutureTask259 14.6.4 ReentrantReadWriteLock259 第15章 原子变量与非阻塞同步机制261 15.1 锁的劣势261 15.2 硬件对并发的支持262 15.2.1 比较并交换263 ...
Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工具,可以看成是个通行证
CountDownLatch 闭锁 AQS 锁的公共类 20180514 String, 部分Character 20180508 除 Set 外, 常用的 Collection 都已经分析完毕 简化语言描述, 增加测试用例(实践用法) 接触到新的类再看源码(不能脱离实际场景瞎看, ...
CountDownLatch 循环屏障 换货商 重入锁 读锁 信号 线程池 BlockingQueue-生产者消费者 具有一些集合类的自定义实现 有以下示例代码 易挥发的 僵局 java.util.concurrent.Phaser构造 执行者 使用单独的线程打印奇数...
主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。
JAVA并发编程实战的示例及其他 第5章:基础构建模块 对应类包com.baijia123.concurrent TestHarnes->在计时测试中使用CountDownLatch(闭锁)来启动和停止线程 Preloader->使用FutureTask来提前加载稍后需要的数据 ...
该示例中显示的代码使用countDownLatch,它等待请求完成。 在这种情况下,连接器将异步运行,并且不应阻塞主线程。 查询和插入的结果将存储在阻塞队列中。 该阻塞队列等待,直到completionHandlers返回结果为止。 此...