CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助
多线程情况下,每条线程执行顺序不固定,如果有业务代码需要在多线程执行后在执行就会出现类似于指令重排一样
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
final int a = i;
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+a);
}).start();
}
System.out.println("结束了");
}
执行结果
这种情况下需要对我们的线程进行控制保证所有的线程都执行了,才能完后接着执行,于是就用到了 CountDownLatch
CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。
public static void main(String[] args) throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
final int a = i;
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+a);
countDownLatch.countDown();
}).start();
}
countDownLatch.await();
System.out.println("结束了");
}
线程池情况下执行
public static void main(String[] args) throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
final int a = i;
executor.execute(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+a);
countDownLatch.countDown();
});
}
countDownLatch.await();
executor.shutdown();
System.out.println("结束了");
}



