《Effective Java》书中对CountDownLatch的描述:倒计数(倒计时顺口些)锁是一次性的障碍,允许一个或多个线程等待一个或多个其它线程来做其它事情。CountDownLatch的唯一构造器带有一个int类型的参数,这个int参数是指允许所有在等待的线程被处理之前,必须在倒计时锁上调用countDown()方法的次数。
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* description:
* author: yangzihe
* date: 2019-03-28 11:15
**/
public class DemoTest {
@Test
public void test2() {
CountDownLatch countDownLatch = new CountDownLatch(5);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(1);
countDownLatch.countDown();
System.out.println(2);
}
});
}
System.out.println(3);
try {
countDownLatch.await();//一定会在countDownLatch.countDown();之前执行吗? -->NO
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(4);
}
}
输出:
1
2
1
2
1
2
3
1
2
1
2
4
当前线程等待任务线程执行5次完成后才会继续执行。countDown()将计数值5相应减小了。