一、示例
public class CountDownLatchTest { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(1); for (int i = 0; i < 10; i++) { final int t = i; new Thread(new Runnable() { @Override public void run() { try { latch.await(); System.out.println(t + "执行"); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } latch.countDown(); } }
输出:
1执行
5执行
3执行
7执行
2执行
0执行
9执行
8执行
6执行
4执行
说明:
1)CountDownLatch初始值为1;
2)我们发起了10个线程;
3)每个线程调用await()方法进入等待;
4)当CountDownLatch的值为0的时候,所有线程同时执行。
二、CountDownLatch
上面示例中,我们使用CountDownLatch来简单实现了多线程并发的效果。
CountDownLatch在java.util.concurrent包下,直接继承于Object类
它是一个同步辅助类,在完成一组正在其他线程中执行的操作前,它允许一个或者多个线程一直等待。
用给定的计数初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
1)初始化
CountDownLatch latch = new CountDownLatch(1);
2)等待
latch.await();
3)递减
latch.countDown();
如果计数到达零,则释放所有等待的线程
详细内容请参考文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/CountDownLatch.html