Java多线程之concurrent包(六)——CountDownLatch

来源:互联网 发布:阿里云备案在哪 编辑:程序博客网 时间:2024/05/16 00:57

CountDownLatch是减计数方式,计数==0时释放所有等待的线程;

CountDownLatch当计数到0时,计数无法被重置;

CountDownLatch每次调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响;

示例代码:

public class TestCountDownLatch {    private static final int N = 10;    public static void main(String[] args) throws InterruptedException {        CountDownLatch doneSignal = new CountDownLatch(N);//10计数器        CountDownLatch startSignal = new CountDownLatch(1);//1个计数器        for (int i = 1; i <= N; i++) {              new Thread(new Worker(i, doneSignal, startSignal)).start();        }        System.out.println("begin------------");          startSignal.countDown();//计数器-1        doneSignal.await();//等待        System.out.println("Ok");      }    static class Worker implements Runnable {        private final CountDownLatch doneSignal;          private final CountDownLatch startSignal;          private int beginIndex;        Worker(int beginIndex, CountDownLatch doneSignal,                  CountDownLatch startSignal) {              this.startSignal = startSignal;              this.beginIndex = beginIndex;              this.doneSignal = doneSignal;          }        @Override        public void run() {            try {                  startSignal.await();                 beginIndex = (beginIndex - 1) * 10 + 1;                  for (int i = beginIndex; i < beginIndex + 10; i++) {                      System.out.println(i);                  }              } catch (InterruptedException e) {                  e.printStackTrace();              } finally {                  doneSignal.countDown();              }         }    }}

运行结果如下:

begin------------111213141516171819201234567891021222324252627282930414231323334353637383940435152535455445671727374757677787991929394959697989910061626364656667686970454647484950818283848057585960858687888990Ok
0 0
原创粉丝点击