CountDownLatch是另外一种线程同步工具。参与倒数的每个线程在工作完成后都执行countDown()方法,当所有线程都执行完后,会唤醒一个或多个在等待倒数计数为0的线程。
package com.test.concurrence;
import java.util.Date;
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) {
final CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService executorService = Executors.newFixedThreadPool(10);
//建立10个倒数线程。
for(int i=0;i<10;i++){
executorService.submit(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(1000* new Random().nextInt(20));
} catch (InterruptedException e) {
e.printStackTrace();
}
//每个参与倒数的线程都倒数1次,计数减1.
countDownLatch.countDown();
System.out.println("count:" + countDownLatch.getCount() + " , " + new Date());
}
});
}
//建立3个等待倒数计数为0的线程。
for(int i=0;i<3;i++){
executorService.submit(new Runnable(){
@Override
public void run() {
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ready:" + countDownLatch.getCount() + " , " + new Date());
}
});
}
executorService.shutdown();
}
}运行结果如下:
count:9 , Sat Mar 18 23:11:16 CST 2017
count:7 , Sat Mar 18 23:11:18 CST 2017
count:8 , Sat Mar 18 23:11:18 CST 2017
count:6 , Sat Mar 18 23:11:20 CST 2017
count:5 , Sat Mar 18 23:11:25 CST 2017
count:4 , Sat Mar 18 23:11:25 CST 2017
count:3 , Sat Mar 18 23:11:26 CST 2017
count:2 , Sat Mar 18 23:11:27 CST 2017
count:1 , Sat Mar 18 23:11:33 CST 2017
count:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017