1:CountDownLatch 是当状态达到后即当计数器为零,所有线程通过后CountDownLatch不可再用。而CyclicBarrier 可以当状态达到后,所有线程通过后即可重复使用。
2:CountDownLatch 等待的是事件。CyclicBarrier 等待的是线程.
这里解释下等待事件和线程的区别.
由于CountDownLatch 存在countDown()方法。即对计数器减去1
假设我们有如下代码:CountDownLatch latch = new CountDownLatch(5);
我们在一个线程中对countDown()调用了5次。那么这个CountDownLatch的计数器就减为零。
然后等待的线程就可以通过了。
CyclicBarrier 一直等待指定数量的线程是否全部已经到达await()点了。如果全部达到,则“开闸”释放所有线程继续执行。
我们来看下CyclicBarrier 的方法:
await() | 阻塞知道指定线程到达 |
getParties() | 获取初始指定线程数量 |
await(long timeout, TimeUnit unit) | 阻塞指定的时间内等待所有线程到达。如果没有则返回。 |
isBroken | 查询是否处于损坏状态 |
reset | 重置为初始状态 |
getNumberWaiting() | 获取等待线程数量 |
再看下它的构造器:
CyclicBarrier(int parties) | 指定初始化关卡数量 |
CyclicBarrier(int parties, Runnable barrierAction) | 此处指定了一个Runnable对象。由最后一个进入barrier的线程来执行这个操作. |
举例说明下CyclicBarrier的几种用法:
1.重复使用
package com.asiainfo.concurrent; /** * @author fansh */ import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(5); System.out.println(barrier.getParties()); for(int i=0;i<5;i++){ BarrierThread thread = new BarrierThread(barrier); thread.start(); } } } class BarrierThread extends Thread{ private CyclicBarrier barrier; public BarrierThread(CyclicBarrier barrier){ this.barrier=barrier; } @Override public void run() { System.out.println(Thread.currentThread().getName()+"first point running! ..........."); try { barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"first point finished!............."); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"second point running! ..........."); try { barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"second point finished!............."); } }