CountDownLatch 自己的一点理解

来源:互联网 发布:窗帘算法 编辑:程序博客网 时间:2024/04/27 23:19
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            }        }    }}

0 0
原创粉丝点击