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
目录
打赏
0
0
0
0
6
分享
相关文章
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
165 0
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
239 1
flutter:dialog (十一)
本文介绍了 Flutter 中常用的弹窗组件和方法,包括 `AlertDialog`、`SimpleDialog`、`showModalBottomSheet` 和 `toast`。每个组件的使用方法和示例代码都进行了详细说明,帮助开发者快速理解和应用这些弹窗功能。例如,`AlertDialog` 用于显示带有标题、内容和按钮的对话框;`SimpleDialog` 用于显示多个选项供用户选择;`showModalBottomSheet` 用于从屏幕底部弹出模态对话框;而 `toast` 则用于显示短暂的消息提示。文中还提供了如何处理点击事件、取消弹窗等常见操作的代码示例。
120 1
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
MoneyPrinterPlus使用AI大模型技术,一键批量生成各类短视频。一键混剪短视频,批量生成短视频不是梦。自动把视频发布到抖音,快手,小红书,视频号上。
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
DataWorks操作报错合集之提示add odps.sql.text.schema.mismatch.mode,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
167 1
设置pycharm使用pytest执行测试用例时,输出print语句至控制台
设置pycharm使用pytest执行测试用例时,输出print语句至控制台
570 0
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等