zoukankan      html  css  js  c++  java
  • CountDownLatch---多线程等待

     1 import java.util.concurrent.CountDownLatch;
     2 
     3 /**
     4  * @author sulishi
     5  * @version 1.0
     6  * @date 2021/1/31
     7  */
     8 public class CountDownLatchTest {
     9     public static void main(String[] args) throws InterruptedException {
    10         CountDownLatchTest countDownLatchTest = new CountDownLatchTest();
    11         System.out.println(countDownLatchTest.timeTasks(5, new Runnable() {
    12             @Override
    13             public void run() {
    14                 System.out.println("doing something");
    15             }
    16         }));
    17     }
    18 
    19 
    20     public long timeTasks(int nThreads, final Runnable task)
    21             throws InterruptedException {
    22         final CountDownLatch startGate = new CountDownLatch(1);
    23         final CountDownLatch endGate = new CountDownLatch(nThreads);
    24 
    25         for (int i = 0; i < nThreads; i++) {
    26             Thread t = new Thread() {
    27                 @Override
    28                 public void run() {
    29                     try {
    30                         //new Thread的时候计数器为1,所有线程都不会执行下面的任务
    31                         startGate.await();
    32                         try {
    33                             task.run();
    34                         } finally {
    35                             //每个线程执行完成调用-1
    36                             endGate.countDown();
    37                         }
    38                     } catch (InterruptedException ignored) {
    39                     }
    40                 }
    41             };
    42             t.start();
    43         }
    44 
    45         long start = System.nanoTime();
    46         //for循环创建所有线程后,再执行startGate.countDown(),计数器减为0,所有线程同时开始抢占资源,执行任务
    47         startGate.countDown();
    48         //所有线程未全部执行完,计数器就未减到0,等待
    49         endGate.await();
    50         long end = System.nanoTime();
    51         return end - start;
    52     }
    53 }

    CountDownLatch是闭锁的一种灵活实现,闭锁常用于以下场景:

    1.确保某个任务在其所需要的全部资源都初始化后才继续执行

    2.确保某个服务在其依赖的所有服务都已经启动之后才启动

    3.等待某个操作的所有参与者都就绪再继续执行

  • 相关阅读:
    DLL库
    C#:时间转换
    视频通信网址
    C#:向exe传值
    C#:复杂条件判断类型(练习)
    注册、卸载DLL
    Windows:常见问题
    WPF:常见问题
    CentOS完美搭建Redis3.0集群并附测试
    xargs命令
  • 原文地址:https://www.cnblogs.com/sulishihupan/p/14352326.html
Copyright © 2011-2022 走看看