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();

浙公网安备 33010602011771号