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.等待某个操作的所有参与者都就绪再继续执行

  • 相关阅读:
    VS 2017 没有工具栏中没有Report Viewer的解决方案
    数据类型和C#关系对应
    .NET CORE部署各种问题
    .NET CORE AutoMapper使用
    .NET CORE 配置Swagger文档
    window快捷登陆linux的的设置方式(设置ssh的config配置)
    linux安装mongodb并启动
    windows更改DNS设置
    scp的使用
    浏览器缓存机制
  • 原文地址:https://www.cnblogs.com/sulishihupan/p/14352326.html
Copyright © 2011-2022 走看看