CountDownLatch是使用一组线程来等待其它线程执行完成,先执行子线程,再执行主线程。
package com.mindview.thread.util;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
Long begin = System.nanoTime();
CountDownLatchTest te = new CountDownLatchTest();
ExecutorService ex = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(6);
for(int i=0;i<6;i++) {
ex.execute(te.new Test(latch));
}
latch.await();//阻塞主线程。执行 countDown方法 为0时主线程执行。
ex.shutdown();
Long end = System.nanoTime();
String second = ((double)end-begin)/1000/1000/1000 +"s";
System.out.println("main---"+Thread.currentThread()+"=="+second);
}
class Test implements Runnable {
private CountDownLatch latch;
Test(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run() {
// TODO Auto-generated method stub
Long begin = System.nanoTime();
try {
Thread.sleep(new Random().nextInt(1000)+1000);
Long end = System.nanoTime();
String second = ((double)end-begin)/1000/1000/1000 +"s";
System.out.println(Thread.currentThread()+"=="+second);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
latch.countDown();// -1
}
}
}
}