package com.lyq.jsoup.MyQueue; /** * Created by mike on 2016/12/19. */ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * 示例:CountDownLatch的使用举例 * 构造方法参数指定了计数的次数 * countDown方法,当前线程调用此方法,则计数减一 * await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 */ public class TestCountDownLatch { private static final int N = 5; public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1);//控制每一个线程是否开始 CountDownLatch doneSignal = new CountDownLatch(N); for (int i = 1; i <= N; i++) { new Thread(new Worker(doneSignal, startSignal), "t" + i).start();//所有线程启动,都处于等待状态 } System.out.println("begin------------"); startSignal.countDown();//2:所有线程都执行 doneSignal.await();//3:等待所有的线程执行完毕 System.out.println("Ok"); } static class Worker implements Runnable { private final CountDownLatch doneSignal; private final CountDownLatch startSignal; Worker(CountDownLatch doneSignal, CountDownLatch startSignal) { this.startSignal = startSignal; this.doneSignal = doneSignal; } public void run() { try { startSignal.await(); //1:等待开始执行信号的发布 System.out.println("thread name:" + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } finally { doneSignal.countDown();//4:每个线程一行完成,都会减一,知道doneSignal.count = 0 } } } }