【同步工具类】CountDownLatch

  闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态。

  作用:相当于一扇门,在到达结束状态之前,这扇门一直是关闭的,并且没有任务线程能够通过,当到达结束状态时,这扇门会打开并允许所有的线程通过,并且将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行。

  例如,确保某个计算在其需要的所有资源都被初始化之后才继续执行。

  CountDownLatch是一种灵活的闭锁实现,闭锁状态包含一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了。

而await方法等待计数器达到零,这表示所有等待的事件都已经发生。如果计数器的值非零,那么await会一直阻塞到计数器为零,或者等待中的线程中断或等待超时。

  

 1 package cn.sp.t9;
 2 
 3 import java.util.concurrent.CountDownLatch;
 4 
 5 /**
 6  * @Author: 2YSP
 7  * @Description: 在计时测试中使用CountDownLatch来启动和停止线程
 8  * @Date: Created in 2018/3/2
 9  */
10 public class TestHarness {
11 
12     public long timeTasks(int nThreads,final Runnable task)throws InterruptedException{
13         final CountDownLatch startGate = new CountDownLatch(1);
14         final CountDownLatch endGate = new CountDownLatch(nThreads);
15 
16         for (int i = 0;i < nThreads;i++){
17 
18             Thread t = new Thread(){
19                 @Override
20                 public void run() {
21                     try {
22                         startGate.await();
23                         try {
24                             task.run();
25                         }finally {
26                             endGate.countDown();
27                         }
28                     }catch (InterruptedException e){
29 
30                     }
31 
32                 }
33             };
34             t.start();
35         }
36         long start = System.nanoTime();
37         startGate.countDown();
38         endGate.await();
39         long end = System.nanoTime();
40         return end - start;
41     }
42 }

代码示例创建了两个闭锁,分别表示“起始门”和“结束门”,当所有线程准备完毕后,打开起始门。每个线程最终都要将计数器减1,等待所有线程执行完毕,打开结束门计算代码执行时间。

 

posted @ 2018-03-02 15:08  烟味i  阅读(162)  评论(0编辑  收藏  举报