• 【同步工具类】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,等待所有线程执行完毕,打开结束门计算代码执行时间。

     

  • 相关阅读:
    sublime3 常用快捷键
    sublime3 常用插件
    前端整理——css部分
    JS数组与对象的遍历方法大全
    Javascript 异步加载详解
    五大主流浏览器内核的源起以及国内各大浏览器内核总结
    JavaScript的分支结构(switch,if..else)
    js---作用域,作用域链,立即执行函数,闭包
    js预编译
    利用js实现轮播图
  • 原文地址:https://www.cnblogs.com/2YSP/p/8493337.html
Copyright © 2020-2023  润新知