iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用CountDownLatch
  • 275
分享到

如何使用CountDownLatch

2024-04-02 19:04:59 275人浏览 独家记忆
摘要

这篇文章主要介绍“如何使用CountDownLatch”,在日常操作中,相信很多人在如何使用CountDownLatch问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用

这篇文章主要介绍“如何使用CountDownLatch”,在日常操作中,相信很多人在如何使用CountDownLatch问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用CountDownLatch”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

“CountDownLatch”

想象一下这样一个场景,当我们需要等待某些线程执行完之后,再执行主线程的代码,要怎么实现?

可能有人会说,简单,用 join() 方法等待线程执行完成之后再执行主线程就行了,实现代码是这样的:

// 创建线程1 Thread t1 = new Thread(new Runnable() {     @Override     public void run() {         // do something     } }); t1.start();  // 创建线程2 Thread t2 = new Thread(new Runnable() {     @Override     public void run() {         // do something     } }); t2.start();  // 等待线程 1和线程 2 执行完 t1.join(); t2.join();

当然,如果使用的是 Thread 来执行任务,那这种写法也是可行的。然而真实的(编码)环境中我们是不会使用 Thread  来执行多任务的,而是会使用线程池来执行多任务,这样可以避免线程重复启动和销毁所带来的性能开销,实现代码如下:

// 创建固定线程数的线程池 ExecutorService executorService = Executors.newFixedThreadPool(2); // 任务一 executorService.submit(new Runnable() {     @Override     public void run() {         // do something     } }); // 任务二 executorService.submit(new Runnable() {     @Override     public void run() {         // do something     } });

那么这时候问题来了线程池是没有 join() 方法的,那要怎么实现等待呢?

这个时候就要派出我方大将“CountDownLatch”啦。

吾有上将潘凤,可斩华雄... 出场数秒,潘凤...“卒”。

等等导演,我觉得剧情应该是这样的...

CountDownLatch使用

为了实现等待所有线程池执行完之后再执行主线程的逻辑,我决定使用  AQS(AbstractQueuedSynchronizer,抽象同步框架)下的著名类 CountDownLatch 来实现此功能,具体的实现代码如下:

public static void main(String[] args) throws InterruptedException {     // 创建 CountDownLatch     CountDownLatch countDownLatch = new CountDownLatch(2);      // 创建固定线程数的线程池     ExecutorService executorService = Executors.newFixedThreadPool(2);     // 任务一     executorService.submit(new Runnable() {         @Override         public void run() {             // do something             try {                 // 让此任务执行 1.2s                 Thread.sleep(1200);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println("我是任务一");             countDownLatch.countDown();         }     });     // 任务二     executorService.submit(new Runnable() {         @Override         public void run() {             // do something             try {                 // 让此任务执行 1.2s                 Thread.sleep(1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println("我是任务二");             countDownLatch.countDown();         }     });          // 等待任务执行完成     countDownLatch.await();     System.out.println("程序执行完成~"); }

以上程序执行结果如下:

如何使用CountDownLatch

从上述结果可以看出,主线程的执行是等待任务一和任务二都执行完成之后才执行的。

CountDownLatch实现原理

CountDownLatch 中 count down 是倒数的意思,latch  则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有点“321,芝麻开门”的感觉,CountDownLatch 的作用也正是如此。

CountDownLatch 在创建的时候需要传入一个整数,在这个整数“倒数”到 0  之前,主线程需要一直挂起等待,直到其他的线程都执行之后,主线才能继续执行。

CountDownLatch执行流程

CountDownLatch 的实现是在其内部创建并维护了一个 volatile 类型的整数计数器,当调用 countDown()  方法时,会尝试将整数计数器 -1,当调用 wait() 方法时,当前线程就会判断整数计数器是否为 0,如果为 0,则继续往下执行,如果不为  0,则使当前线程进入等待状态,直到某个线程将计数器设置为 0,才会唤醒在 await() 方法中等待的线程继续执行。

CountDownLatch常用方法

// 线程被挂起直到 count 值为 0 才继续执行 public void await() throws InterruptedException { };     // 和 await() 类似,只不过等待一定的时间后 count 值还没变为 0 的话就会继续执行 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };    // 将 count 值减 1 public void countDown() { };

到此,关于“如何使用CountDownLatch”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何使用CountDownLatch

本文链接: https://www.lsjlt.com/news/83202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用CountDownLatch
    这篇文章主要介绍“如何使用CountDownLatch”,在日常操作中,相信很多人在如何使用CountDownLatch问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用...
    99+
    2022-10-19
  • JAVA中CountDownLatch怎么使用
    在Java中,CountDownLatch是一个同步辅助类,它可以让一个或多个线程等待其他线程完成操作后再继续执行。CountDow...
    99+
    2023-09-12
    JAVA
  • JavaAQS中闭锁CountDownLatch的使用
    目录一. 简介二. 使用三. 应用场景四. 底层原理五. CountDownLatch与Thread.join的区别一. 简介 CountDownLatch(闭锁)是一个同步协助类,...
    99+
    2023-02-02
    Java CountDownLatch Java 闭锁CountDownLatch Java 闭锁
  • 如何掌握CountDownLatch用法和源码
    这篇文章主要介绍“如何掌握CountDownLatch用法和源码”,在日常操作中,相信很多人在如何掌握CountDownLatch用法和源码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-19
  • Java并发编程之CountDownLatch的使用
    目录前言基本使用await尝试获取锁获取锁失败countDown方法前言 CountDownLatch是一个倒数的同步器,和其他同步器不同的是,state为0时表示获取锁成功。常用来...
    99+
    2023-05-20
    Java并发编程CountDownLatch Java CountDownLatch使用 Java CountDownLatch
  • CountDownLatch介绍和使用【Java多线程必备】
    点击 Mr.绵羊的知识星球 解锁更多优质文章。 目录 一、介绍 二、特性 三、实现原理 四、适用场景 五、注意事项 六、实际应用 一、介绍     CountDownLatch 是 Java 中的一个并发工具类,用于协调多个线程之间...
    99+
    2023-10-21
    java
  • 怎么在Java中使用CountDownLatch实现并发编程
    本篇文章为大家展示了怎么在Java中使用CountDownLatch实现并发编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We...
    99+
    2023-06-14
  • Java多线程同步工具类CountDownLatch怎么使用
    本篇内容主要讲解“Java多线程同步工具类CountDownLatch怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程同步工具类CountDownLatch怎么使用”吧!简介...
    99+
    2023-07-02
  • java并发使用CountDownLatch在生产环境翻车剖析
    目录前言需求背景具体实现解决方案总结前言 大家好,我是小郭,之前分享了CountDownLatch的使用,我们知道用来控制并发流程的同步工具,主要的作用是为了等待多个线程同时完成任务...
    99+
    2022-11-13
    java并发CountDownLatch java并发
  • Java使用CountDownLatch实现网络同步请求的示例代码
    CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。 这里是使用CountDownLatch和...
    99+
    2023-01-04
    Java CountDownLatch网络同步请求 Java CountDownLatch同步请求 Java CountDownLatch
  • 如何使用fastcache
    小编给大家分享一下如何使用fastcache,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VnTrader 2.0版本有不少提速措施,其中lru_cache是提高...
    99+
    2023-06-02
  • crystaldiskinforh如何使用
    这篇文章主要介绍“crystaldiskinforh如何使用”,在日常操作中,相信很多人在crystaldiskinforh如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-09
  • Cython如何使用
    这篇文章主要讲解了“Cython如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Cython如何使用”吧!Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被P...
    99+
    2023-06-27
  • RPM如何使用
    这篇文章主要介绍了RPM如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇RPM如何使用文章都会有所收获,下面我们一起来看看吧。RPM Package Manager (RPM) 是一个强大的命令行驱动的软...
    99+
    2023-06-27
  • HTTPie如何使用
    今天小编给大家分享一下HTTPie如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HTTPie 是一个 HTTP 的命...
    99+
    2023-06-28
  • vue.extend如何使用
    本文小编为大家详细介绍“vue.extend如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue.extend如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.Vue.extend的使用参数:对...
    99+
    2023-07-05
  • np.ones如何使用
    这篇文章主要介绍了np.ones如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇np.ones如何使用文章都会有所收获,下面我们一起来看看吧。概述np.ones()函数返回给定形状和数据类型的新数组,其中...
    99+
    2023-07-05
  • np.unique()如何使用
    本篇内容主要讲解“np.unique()如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“np.unique()如何使用”吧!一、np.unique() 介绍对于一维数组或者列表,np.un...
    99+
    2023-07-05
  • MySqlBulkLoader如何使用
    这篇文章主要介绍了MySqlBulkLoader如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySqlBulkLoader如何使用文章都会有所收获,下面我们一起来看看吧。一、MySqlBulkLoad...
    99+
    2023-07-02
  • webpack如何使用
    本篇内容介绍了“webpack如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!webpack介绍和使用一、webpack介绍1、由来由...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作