Java -- Thread -- Collection -- 16 Java5的CountDownLatch同步工具

好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行。

       举例:多个运动员等待裁判命令:    裁判等所有运动员到齐后发布结果

代码示例:

ExecutorService service = Executors.newCachedThreadPool();
裁判发布命令的计数器,计数器为0,运动员就跑
final CountDownLatch cdOrder = new CountDownLatch(1);    
运动员跑到终点的计数器,为0裁判宣布结果
final CountDownLatch cdAnswer = new CountDownLatch(3);
产生3个运动员
for (int i=0; i<3; i++)
{    运动员的任务
    Runnable runnable = new Runnable(){
public void run()
{
    SOP(ThreadName准备接受命令)
    等待发布命令
    cdOrder.await();    计数器为0继续向下执行
    SOP(ThreadName已接受命令)    order计数器为0了
    Thread.sleep(Random);开始跑步
    cdAnswer.countDown();跑到终点了,计数器减1
}
};
    service.execute(runnable);运动员开始任务
}
Thread.sleep(1000)裁判休息一会 再发布命令
SOP(即将发布命令)
cdOrder.countDown();命令计数器置为0,发布命令
SOP(命令已经发布,等待结果)
cdAnswer.await(); 等待所有运动员,计数器为0 所有运动员到位
SOP(宣布结果)

java.util.concurrent.CountDownLatch

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier

CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。

CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await

构造方法摘要

CountDownLatch(int count)           构造一个用给定计数初始化的 CountDownLatch。

方法摘要

 void

await()           使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断

 boolean

await(long timeout, TimeUnit unit)           使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。

 void

countDown()           递减锁存器的计数,如果计数到达零,则释放所有等待的线程。

 long

getCount()           返回当前计数。

 String

toString()           返回标识此锁存器及其状态的字符串。

 

holder

posted on 2016-04-24 19:54  yeatschen  阅读(89)  评论(0)    收藏  举报

导航