CountDownLatch是一种通过计数实现的线程安全:只有当CountDownLatch的值变为0的时候,await线程才会执行。其他线程调用countDown方法之后并不会阻塞,可以执行其他业务。
package com.vincent.juc;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * Vincent 创建于 2016/6/1. */public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { final CountDownLatch countDownLatch=new CountDownLatch(5); final Random random=new Random(); ExecutorService threadPool = Executors.newCachedThreadPool(); for(int i=0;i<5;i++){ threadPool.execute(new Runnable() { @Override public void run() { try { int t = random.nextInt(10); TimeUnit.SECONDS.sleep(t+1); long id = Thread.currentThread().getId(); System.out.println("线程"+id+"执行结束"); countDownLatch.countDown(); System.out.println(id+"做别的事去了"); } catch (Exception e) { e.printStackTrace(); } } }); } System.out.println("主线程开始阻塞"); countDownLatch.await(); System.out.println("主线程开始执行"); }}
输出如下:
主线程开始阻塞线程16执行结束16做别的事去了线程14执行结束14做别的事去了线程13执行结束13做别的事去了线程12执行结束12做别的事去了线程15执行结束15做别的事去了主线程开始执行