java 多线程之CountDownLatch 和CyclicBarrier

CountDownLatch       关于CountDownLatch   有一篇文章写的很好http://www.importnew.com/15731.html

  • 解释一下CountDownLatch概念?

  • CountDownLatch 和CyclicBarrier的不同之处?

  • 给出一些CountDownLatch使用的例子?

  •  CountDownLatch 类中主要的方法?

CountDownLatch 在java.util.concurrent包下, 是一个同步辅助类 在完成一组其他线程执行的操作之前。它允许一个线程或多个线程一直等待。主要方法:await() 和countDown();

 

 

该类只有一个带参数的构造器。

我们可以把这个线程看作一个同步倒数计数器。在倒数计数器为0的时候。停止阻塞。 

例如:主线程调用 一个线程池执行 A任务(A任务很大。所有需要开线程来执行。)。A执行完之前 ,主线程阻塞。

解决方案:

A分成N个部分。N个部分全部执行完毕之后。才能继续执行主线程。

具体操作:      

CountDownLatch       latch = new CountDownLatch(N);

Executor e = Executors.newFixedThreadPool(100);

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

latch.await();//在分配完线程之后。主线程立即调用latch的await方法。使得主线程阻塞。在计数为0时。主线程才能继续执行

class WorkerRunnable implements Runnable { //具体工作线程
  private final CountDownLatch latch;
    private final int i;
    WorkerRunnable(latch , int i) {
    this.latch = latch ;
    this.i = i;
  }
  public void run() {
    try {
      doWork(i);
      latch .countDown();//在每个线程执行完毕之后调用这个countDown方法。执行计数递减操作。
      } catch (InterruptedException ex) {

      } // return;
    }

  void doWork() { ... }
}

CyclicBarrier        和 CountDownLatch很类似。不同的是CyclicBarrier可以重用。

 

CyclicBarrier提供了两个构造方法。 

public CyclicBarrier(int  parties){}

public CyclicBarrier(int  parties,Runnable run){}

例如:4个伙伴相约一起去A地玩。

解析:这里面有每个伙伴要做两件事 1. 先到A地集合。 2等到A地之后。在一起玩耍。

所以设置 到达A地   作Barrier状态。 (调用await方法)

例如2:N个线程同时做写的操作。到全部写入完毕之后才能 开始同时读。。。

所以 设置写完的状态为Barrier状态。(调用await方法)

CyclicBarrier        重要方法: await();

 

posted @ 2017-11-02 14:51  xie风细雨  阅读(66)  评论(0)    收藏  举报