CountDownLatch使用

常用于多线程场景,待多线程都结束后方可继续主线程逻辑处理

CodeConstant 常量类

import java.util.HashMap;
import java.util.Map;public class CodeConstant {public static final Map<String, Map<String, String>> CODE = new HashMap<>();static {//资产1CODE.put(AssetTypeEnum.ZICHAN_1.getCode(),new HashMap<String, String>() {{put("JS", "JS1");put("CHECK", "CHECK1");put("PUBLISH", "PUBLISH1");}});//资产2CODE.put(AssetTypeEnum.ZICHAN_2.getCode(),new HashMap<String, String>() {{put("JS", "JS1");put("CHECK", "CHECK2");put("PUBLISH", "PUBLISH2");}});}
}

CountDownLatchController

import com.example.demo.constant.CodeConstant;
import com.example.demo.service.TestCountDownLatchService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;@RestController
@RequestMapping("/countDownLatch")
public class CountDownLatchController {private static final Logger logger = LoggerFactory.getLogger(CountDownLatchController.class);@Autowiredprivate TestCountDownLatchService downLatchService;@PostMapping("/test")public void testCountDownLatch() {logger.info("测试多线程开始...");try {List<String> list = Arrays.asList("zichan1", "zichan2", "zichan3");CountDownLatch countDownLatch = new CountDownLatch(2);Map<String, Map<String, String>> map = CodeConstant.CODE;for (String type : list) {downLatchService.test(type, map, countDownLatch);}countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}logger.info("测试多线程结束...");}}

TestCountDownLatchService 类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.CountDownLatch;@Service
public class TestCountDownLatchService {private static final Logger logger = LoggerFactory.getLogger(TestCountDownLatchService.class);@Asyncpublic void test(String type, Map<String, Map<String, String>> map, CountDownLatch countDownLatch) {Map<String, String> typeMap = map.get(type);if (typeMap == null) {countDownLatch.countDown();return;}try {logger.info("类型{}的信息{}", type, typeMap);for (int i = 0; i < 1000; i++) {for (int j = 0; j < 1000; j++) {logger.debug("i*j={}", i * j);}}} catch (Exception e) {logger.error("类型{}异常:", type, e);} finally {countDownLatch.countDown();}}
}

 启动类上补充注解 @EnableAsync

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@EnableAsync
@SpringBootApplication
@MapperScan(basePackages = { "com.example.demo" })
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

测试结果

可以看出,主线程执行"测试多线程开始"后,开启了两个子线程,等待子线程全部完成后,主线程继续执行"测试多线程结束";

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177628.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 启动优化案例-WebView非预期初始化排查

作者&#xff1a;邹阿涛涛涛涛涛涛 去年年底做启动优化时&#xff0c;有个比较好玩的 case 给大家分享下&#xff0c;希望大家能从我的分享里 get 到我在做一些问题排查修复时是怎么看上去又low又土又高效的。 1. 现象 在我们使用 Perfetto 进行app 启动过程性能观测时&#…

2023年【电工(高级)】考试报名及电工(高级)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【电工&#xff08;高级&#xff09;】考试报名及电工&#xff08;高级&#xff09;考试试卷&#xff0c;包含电工&#xff08;高级&#xff09;考试报名答案和解析及电工&#xff08;高级&#xff09;考试试卷…

isomorphic-fetch库代码示例

isomorphic-fetch库的爬虫程序。 typescript // 引入isomorphic-fetch库 import fetch from isomorphic-fetch; // 设置 const proxy ; // 定义视频URL const url ; // 使用fetch获取视频数据 fetch(url, { method: GET, headers: { Accept: application/json, …

2023 PostgreSQL 数据库生态大会:解读拓数派大数据计算系统及其云存储底座

11月3日-5日&#xff0c;由中国开源软件推进联盟 PostgreSQL 分会主办的中国 PostgreSQL 数据库生态大会在北京中科院软件所隆重举行。大会以”极速进化融合新生”为主题&#xff0c;从线下会场和线上直播两种方式展开&#xff0c;邀请了数十位院士、教授、高管和社群专家&…

YOLOv8优化策略:全新的聚焦式线性注意力模块Focused Linear Attention | ICCV2023

🚀🚀🚀本文改进:深入分析了现有线性注意力方法的缺陷,并提出了一个全新的聚焦的线性注意力模块(Focused Linear Attention),同时具有高效性和很强的模型表达能力。 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻…

Cesium 展示——坐标间的转换

文章目录 需求1. 点击位置会后获取的地球坐标2. 笛卡尔坐标(Cartesian3)3. 地理坐标系分析转换关系如下需求 坐标间的转换 1. 点击位置会后获取的地球坐标 Cesium点击位置会后获取的地球坐标。 2. 笛卡尔坐标(Cartesian3) 笛卡尔坐标系中,表示一个在 x 轴上、y轴上、…

Fedora Linux 39 正式版官宣 11 月 发布

导读Fedora Linux 39 正式版此前宣布将于 10 月底发布&#xff0c;不过这款 Linux 发行版面临了一些延期&#xff0c;今天开发团队声称&#xff0c;Fedora Linux 39 正式版将于 11 月 7 日发布。 过查询得知&#xff0c;在近日的 "Go / No-Go" 会议上&#xff0c;开…

轻量封装WebGPU渲染系统示例<28>- MRT纹理(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MRT.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: const colorRTTTex { diffuse: { uuid: "colorRTT", rtt…

若依前后分离版框架下Springboot java引入Mqtt接受发送消息

**这只是其中一种而且是粗浅的接、发消息。 同步机制还要跟搞物联网的同事沟通确认去看看能不能实现 或者是设备比较多的情况下 不会去使用同步机制 首先pom文件 引入依赖 ** <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse…

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真 本来打算今天出去跑一下 GPS&#xff0c;但是下雨&#xff0c;作罢 添加参考轨迹信息 以下三个功能包不需要修改&#xff1a; mrobot&#xff1a;在 Rviz 和 Gazebo 中仿真机器人cmd_to_mrobot&#xff1a;运动学解算&#…

最佳实践-使用Github Actions来构建跨平台容器镜像

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 前言 最近在写K8s的相关系列文章&#xff0c;因为有涉及到镜像构建&#xff0c;发现在Mac m1的Arm架构下构建的部分镜像&#xff0c;没法在X86架构下使用&#xff0c;不兼容。 尝试…

Xocde 升级15 或者 iOS17报错:

错误&#xff1a; Assertion failed: (false && "compact unwind compressed function offset doesnt fit in 24 bits"), function operator(), file Layout.cpp, line 5758. 翻译&#xff1a; 断言失败&#xff1a;&#xff08;false&&“压缩展开…