CountDownLatch

简介: CountDownLatch是从JDK1.5开始提供的一个辅助并发编程的一个类,它位于在JUC包中。允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

一、简介

CountDownLatch是从JDK1.5开始提供的一个辅助并发编程的一个类,它位于在JUC包中。

允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

CountDownLatch使用给定的计数进行初始化。由于调用了countDown方法, 主线程调用await方法一直阻塞,直到当前计数达到零,之后所有等待的线程都被释放,任何后续的await调用立即返回。这是一次性现象——计数无法重置。

二、使用场景

CountDownLatch是一种多功能同步工具,可用于多种用途。

使用计数 1 初始化的CountDownLatch用作简单的开/关锁存器或门:所有调用await的线程在门处等待,直到它被调用countDown的线程打开。

初始化为N的CountDownLatch可用于使一个线程等待,直到N个线程完成某个动作,或者某个动作已完成 N 次。

示例用法:这是一对类,其中一组工作线程使用两个倒计时锁存器:

第一个是启动信号,它阻止任何工人继续前进,直到司机准备好让他们继续前进;

第二个是完成信号,允许驱动程序等待所有工作人员完成。

public class Driver {


  public static void main(String args []) throws InterruptedException {

       CountDownLatch startSignal = new CountDownLatch(1);

       CountDownLatch doneSignal = new CountDownLatch(5);


       for (int i = 0; i < 5; ++i) {

           // create and start threads

           new Thread(new Worker(startSignal, doneSignal)).start();

       }

      System.out.println("don't let run yet"); // don't let run yet

       startSignal.countDown();      // let all threads proceed

      System.out.println("waiting threads running");

      doneSignal.await();           // wait for all to finish

      System.out.println("all threads run over");

   }




   static class Worker implements Runnable {

       private final CountDownLatch startSignal;

       private final CountDownLatch doneSignal;

       Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {

           this.startSignal = startSignal;

           this.doneSignal = doneSignal;

       }

       public void run() {

           try {

               startSignal.await();

               doWork();

               doneSignal.countDown();

           } catch (InterruptedException ex) {} // return;

       }


       void doWork() throws InterruptedException {

           Thread.sleep(5000);

           System.out.println(Thread.currentThread().getName()+"=========");


       }

   }


}


另一个典型的用法是将一个问题分成 N 个部分,用一个 Runnable 描述每个部分,该 Runnable 执行该部分并在锁存器上倒计时,并将所有 Runnables 排队到一个 Executor。当所有子部分都完成后,协调线程就可以通过await了。 (当线程必须以这种方式重复倒计时时,需要使用CyclicBarrier 。)

class Driver2 { // ...

  void main() throws InterruptedException {

    CountDownLatch doneSignal = new CountDownLatch(N);

    Executor e = ...


    for (int i = 0; i < N; ++i) // create and start threads

      e.execute(new WorkerRunnable(doneSignal, i));


    doneSignal.await();           // wait for all to finish

  }

}


class WorkerRunnable implements Runnable {

  private final CountDownLatch doneSignal;

  private final int i;

  WorkerRunnable(CountDownLatch doneSignal, int i) {

    this.doneSignal = doneSignal;

    this.i = i;

  }

  public void run() {

    try {

      doWork(i);

      doneSignal.countDown();

    } catch (InterruptedException ex) {} // return;

  }


  void doWork() { ... }

}

三、常用方法

  • public void await() throws InterruptedException:调用await()方法的线程会被挂起,等待直到count值为0再继续执行。
  • public void countDown(): count值递减1
相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
378 0
|
10月前
|
机器学习/深度学习 JSON 运维
微信抢红包脚本会封号吗?
微信抢红包脚本通常通过以下几种技术方式实现:
|
人工智能 JavaScript Java
看阿里云技术内容工程师如何巧用通义灵码
看阿里云技术内容工程师如何巧用通义灵码
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####
|
存储 开发工具 git
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
670 1
|
开发者 UED
flutter:dialog (十一)
本文介绍了 Flutter 中常用的弹窗组件和方法,包括 `AlertDialog`、`SimpleDialog`、`showModalBottomSheet` 和 `toast`。每个组件的使用方法和示例代码都进行了详细说明,帮助开发者快速理解和应用这些弹窗功能。例如,`AlertDialog` 用于显示带有标题、内容和按钮的对话框;`SimpleDialog` 用于显示多个选项供用户选择;`showModalBottomSheet` 用于从屏幕底部弹出模态对话框;而 `toast` 则用于显示短暂的消息提示。文中还提供了如何处理点击事件、取消弹窗等常见操作的代码示例。
427 1
|
Java 测试技术 API
软件测试中的自动化测试框架选择与应用##
在快速迭代的软件开发周期中,选择合适的自动化测试框架对于提高软件质量和开发效率至关重要。本文探讨了当前流行的几种自动化测试框架的特点和适用场景,旨在为软件开发团队提供决策依据。 ##
|
人工智能 API 语音技术
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
MoneyPrinterPlus使用AI大模型技术,一键批量生成各类短视频。一键混剪短视频,批量生成短视频不是梦。自动把视频发布到抖音,快手,小红书,视频号上。
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
|
应用服务中间件 Apache nginx
apache、nginx开启rewrite重写服务及伪静态
apache、nginx开启rewrite重写服务及伪静态
848 4
开发者说:Sentinel 流控功能在 SpringMVC/SpringBoot 上的实践
从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第6篇,作者 Jason Joo,@友乐活(北京),Sentinel Committer.
25068 93