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 block
e.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 ...