Java并发处理CountDownLatch应用

CountDownLatch概念

一种同步辅助程序,允许一个或多个线程等待在其它线程中执行的一组操作完成。

使用给定的计数初始化CountDownLatch。由于调用了倒计时方法,await方法将阻塞,直到当前计数达到零,然后释放所有等待线程,并立即返回await的任何后续调用。这是一个一次性现象——计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。

倒计时锁存器是一种通用的同步工具,可用于多种目的。使用计数1初始化的倒计时锁存器用作简单的开/关锁存器或门:调用倒计时的线程在门处等待,直到它被调用倒计时的线程打开。初始化为N的倒计时锁存器可用于使一个线程等待N个线程完成某个操作或某个操作已完成N次。

倒计时锁存器的一个有用特性是,它不要求调用倒计时的线程在继续之前等待计数达到零,它只是防止任何线程在所有线程都可以通过之前继续通过等待。

应用例子

1)初始化CountDownLatch为N

2)在主线程中提交N个任务,交给子线程执行;子线程执行完成后,调用CountDownLatch.countDown方法

3)在主线程中调用CountDownLatch.await,会阻塞主线程,知道所有子线程执行完毕

class Driver2 {
  void main() throws InterruptedException {
    CountDownLatch doneSignal = new CountDownLatch(N);
    Executor e = ...

    for (int i = 0; i < N; ++i) {
      // create and start threads
      e.execute(new WorkerRunnable(doneSignal, i));
    }

    doneSignal.await(); //等待所有子线程结束
  }
}

class WorkerRunnable implements Runnable {
  private final CountDownLatch doneSignal;
  private final int i;
  WorkerRunnable(CountDownLatch doneSignal, int i) {
    this.doneSignal = doneSignal;
    this.i = i;
  }
  public void run() {
    try {
      doWork(i);
      doneSignal.countDown();
    } catch (InterruptedException ex) {} // return;
  }

  void doWork() { ... }
}}

 

你可能感兴趣的:(Java)