Java多线程之CountDownLatch

来源:互联网 发布:win 远程桌面 控制mac 编辑:程序博客网 时间:2024/05/16 08:05

CountDownLatch犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数器为0时,则所有等待者或单个等待者开始执行。

package com.javase.thread;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.ReentrantLock;public class CountDownLatchDemo {private static boolean isPrint1=true;private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {final CountDownLatch cdlStart = new CountDownLatch(1);final CountDownLatch cdlEnd = new CountDownLatch(3);ExecutorService threadPool = Executors.newCachedThreadPool();for(int i=0;i<3;i++){Runnable command =new Runnable(){public void run() {System.out.println(Thread.currentThread().getName()+" is waiting now");try {cdlStart.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}lock.lock();try{if(isPrint1){System.out.println("All the 3 threads have already start to continue run ...");isPrint1=false;}}finally{lock.unlock();}try {TimeUnit.MILLISECONDS.sleep(new Random().nextInt(5000));} catch (InterruptedException e1) {e1.printStackTrace();}cdlEnd.countDown();System.out.println(Thread.currentThread().getName()+" has arrived the end ");}};threadPool.execute(command);}try {TimeUnit.MILLISECONDS.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println(Thread.currentThread().getName()+" thread send the start order ");cdlStart.countDown();System.out.println(Thread.currentThread().getName()+" thread is waiting for the result...");try {cdlEnd.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("All the 3 threads have arrived the end ...");threadPool.shutdown();}}
运行结果:

pool-1-thread-1 is waiting now
pool-1-thread-2 is waiting now
pool-1-thread-3 is waiting now
main thread send the start order 
main thread is waiting for the result...
All the 3 threads have already start to continue run ...
pool-1-thread-3 has arrived the end 
pool-1-thread-1 has arrived the end 
pool-1-thread-2 has arrived the end 
All the 3 threads have arrived the end ...

原创粉丝点击