首页 > 其他分享 >CountDownLatch并发工具类

CountDownLatch并发工具类

时间:2022-11-04 14:01:17浏览次数:74  
标签:初始化 Thread System 并发 线程 CountDownLatch println new 工具


作用

CountDownLatch允许一个或多个线程等待其他线程完成操作,相当于一个加强版的join方法。

核心方法

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完 成,这里就传入N。

  • countDown:负责计数器的减一
  • await:阻塞当前线程,直到CountDownLatch计数器变成零

由于countDown方法可以用在任何地方,所以这里说的N个 点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个 CountDownLatch的引用传递到线程里即可。

CountDownLatch使用了AQS来做实现,countDown就是对AQS的state值减一,await就是去验证state是否等于0。

示例

启动一个主线程,需要等到其他子线程初始化完毕

package com.xiaolyuh;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
* 5个初始化线程,6个扣除点,初始化完成后业务线程和住线程才能执行
*
* @author yuhao.wang3
* @since 2019/6/26 15:24
*/
public class CountDownLatchTest {
static final CountDownLatch countDownLatch = new CountDownLatch(6);

public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "主线程开始......");
new Thread(new InitJob()).start();
new Thread(new BusinessWoerk()).start();
new Thread(new InitJob()).start();
new Thread(new InitWoerk()).start();
new Thread(new InitJob()).start();
new Thread(new InitJob()).start();

try {
System.out.println(Thread.currentThread().getName() + "主线程等待初始化线程初始化完成......");
countDownLatch.await(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}

sleep(5);
System.out.println(Thread.currentThread().getName() + "主线程结束......");
}

/**
* 一个线程一个扣减点
*/
static class InitJob implements Runnable {

@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "初始化任务开始。。。。。。");
try {
sleep(5);
} finally {
countDownLatch.countDown();
}
sleep(5);
System.out.println(Thread.currentThread().getName() + "初始化任务完毕后,处理业务逻辑。。。。。。");
}
}

/**
* 一个线程两个扣减点
*/
static class InitWoerk implements Runnable {

@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "初始化工作开始第一步》》》》》");
try {
sleep(5);
} finally {
countDownLatch.countDown();
}
System.out.println(Thread.currentThread().getName() + "初始化工作开始第二步》》》》》");
sleep(5);
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName() + "初始化工作处理业务逻辑》》》》》");
}
}


/**
* 业务线程
*/
static class BusinessWoerk implements Runnable {

@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "初始化线程还未完成,业务线程阻塞----------");
countDownLatch.await(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "初始化工作完成业务线程开始工作----------");
System.out.println(Thread.currentThread().getName() + "初始化工作完成业务线程开始工作----------");
System.out.println(Thread.currentThread().getName() + "初始化工作完成业务线程开始工作----------");
System.out.println(Thread.currentThread().getName() + "初始化工作完成业务线程开始工作----------");
}
}

private static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

输出结果:

main主线程开始......
main主线程等待初始化线程初始化完成......
Thread-0初始化任务开始。。。。。。
Thread-1初始化线程还未完成,业务线程阻塞----------
Thread-2初始化任务开始。。。。。。
Thread-3初始化工作开始第一步》》》》》
Thread-4初始化任务开始。。。。。。
Thread-5初始化任务开始。。。。。。
Thread-3初始化工作开始第二步》》》》》
Thread-0初始化任务完毕后,处理业务逻辑。。。。。。
Thread-3初始化工作处理业务逻辑》》》》》
Thread-2初始化任务完毕后,处理业务逻辑。。。。。。
Thread-4初始化任务完毕后,处理业务逻辑。。。。。。
Thread-5初始化任务完毕后,处理业务逻辑。。。。。。
Thread-1初始化工作完成业务线程开始工作----------
Thread-1初始化工作完成业务线程开始工作----------
Thread-1初始化工作完成业务线程开始工作----------
Thread-1初始化工作完成业务线程开始工作----------
main主线程结束......

参考

《java并发编程的艺术》

源码

​https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases​

spring-boot-student-concurrent 工程

layering-cache

为监控而生的多级缓存框架 layering-cache这是我开源的一个多级缓存框架的实现,如果有兴趣可以看一下


标签:初始化,Thread,System,并发,线程,CountDownLatch,println,new,工具
From: https://blog.51cto.com/u_15861563/5823726

相关文章

  • CyclicBarrier并发工具类
    作用让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开放,所有被屏障拦截的线程才会继续运行。核心方法CyclicBarrier(intparties):默认构......
  • CyclicBarrier和CountDownLatch的区别
    CountDownLatch是两组线程,第一组负责计数器减一,第二组是阻塞线程,当第一组线程将计数器减到0时,第二组线程才开始执行,放行是由第三方控制;CyclicBarrier是只有一组线程,只有当所......
  • js 密码强度检测工具
    效果:  新建一个密码强度检测工具文件 password-strength.js://hasnumberconsthasNumber=(number)=>newRegExp(/[0-9]/).test(number);//hasmixofs......
  • Unity 常用功能代码工具集
    Unity常用功能整理安卓摄像头的调用请求与拍摄、截图//////————————SakuraNeko————————//////博客园:https://www.cnblogs.com/sakuraneko//......
  • Rocksdb 日志分析工具 -- 性能和稳定性分析
    文章目录​​1.前言​​​​2.工具使用细节​​​​3.如何制作一个自己的python-package​​​​3.1项目配置文件​​​​3.1.1LICENSE文件​​​​3.2README.md文......
  • Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验
    场景GuavaGuava项目是Google公司开源的Java核心库,它主要是包含一些在Java开发中经常使用到的功能,如数据校验、不可变集合、计数集合,集合增强操作、I/O、缓存、字......
  • 桌面取色器小工具
    color-picker-app基于Tauri+Vue3的取色器软件,可对桌面进行取色项目地址:https://github.com/Hxy1992/color-picker-app软件下载:https://github.com/Hxy1992/c......
  • vue3.0新的打包工具vite
    vitevite是基于esbuild预构建的,esbuild是用GO语言编写的,比js编写的打包器预构建快10-100倍,js跟go语言相比太慢了。与webpack相比:vite服务器启动速度比webpack快,由于vite......
  • less编译工具koala(考拉)和rem的使用
    1.使用rem的前提是要提前设置好页面的根节点的大小:(两种选择任意一种即可)(1).在body中设置font-size:16px(2).<script>(function(){varhtml=......
  • 【Unity3D日常开发】Unity3D工具之UnityForSVN
    大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。一、前言在日常开发中,常常会用到SVN或者Git作为项目版本协同管理的工具,可是在Unity......