一个关于CountDownLatch的并发需求
需求
A,B,C可并发运行,全部成功才算成功,一个失败全员回滚。
思考
使用CountDownLatch,可以保证三个线程结束后,才进行提交成功状态。但是怎么才能判断某个任务失败了呢?
- 捕获子线程异常?
- await(long timeout, TimeUnit unit)?
陷入了沉思
加一个原子变量判断子线程异常的次数不就OK嘛(分布式用分布式锁,单机用原子类)
@GetMapping("/{id}")
String test(@PathVariable("id") String id) {
ThreadPoolExecutor threadPoolExecutor = ExecutorFactory.newCustomerThreadExecutor(3, 3, 1000, new NameThreadFactory("画像表"));
// 失败线程数
LongAdder failThreadNum = new LongAdder();
int threadSize = 2;
CountDownLatch cdl = new CountDownLatch(threadSize);
Thread t1 = new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName());
if (Objects.equals(id, "1")) {
throw new RuntimeException();
}
} catch (Exception e) {
failThreadNum.increment();
} finally {
cdl.countDown();
}
});
Thread t2 = new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName());
} catch (Exception e) {
failThreadNum.increment();
} finally {
cdl.countDown();
}
});
threadPoolExecutor.submit(t1);
threadPoolExecutor.submit(t2);
try {
cdl.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (failThreadNum.intValue() != 0) {
System.out.println("回滚");
} else {
System.out.println("Main over");
}
threadPoolExecutor.shutdown();
return "success";
}
一个关于CountDownLatch的并发需求的更多相关文章
- 不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator
使用场景 在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同时对服务器发出太多请求(可能会 ...
- 一个WEB网站高并发量的解决方案
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...
- 飘逸的python - 解决一个有限制的组合需求
假设有一个团队技能的需求. 这类技能是要集齐所有指定的人就能激活. 但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合. 这种组合跟普通组合不一样,普通组合可以随意组合.而这种组合是每 ...
- 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理
在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...
- 在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?
平时还是比较喜欢看书的..但有时候遇到问题还是经常感到脑袋一蒙..智商果然是硬伤.. 同事发现了个问题,代码如下: class Program { static void Main(string[] ...
- 基于c++11新标准开发一个支持多线程高并发的网络库
背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...
- 【2020】DBus,一个更能满足企业需求的大数据采集平台
功能远超Sqoop.DataX.Flume.Logatash.Filebeat等采集工具 注:由于文章篇幅有限,完整文档可扫免费获取 深知其他组件的局限性,才能彰显DBus的优越感 当前有很多数据采集 ...
- 记一个关于std::unordered_map并发访问的BUG
前言 刷题刷得头疼,水篇blog.这个BUG是我大约一个月前,在做15445实现lock_manager的时候遇到的一个很恶劣但很愚蠢的BUG,排查 + 摸鱼大概花了我三天的时间,根本原因是我在使用s ...
- 由一个滑动条的任务需求产生一个对UISlider控件的探讨
任务需求样式:
- Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...
随机推荐
- 全网最适合入门的面向对象编程教程:46 Python函数方法与接口-函数与事件驱动框架
全网最适合入门的面向对象编程教程:46 Python 函数方法与接口-函数与事件驱动框架 摘要: 函数是 Python 中的一等公民,是一种可重用的代码块,用于封装特定的逻辑:事件驱动框架是一种编程模 ...
- TypeScript – Get Started Advanced (Work with SystemJS)
更新 我本来想 skip 掉 bundler (webpack), 感觉单侧不需要搞那么复杂, 所以用了 TypeScript 自带的 bundle (outFile) + SystemJS. 谁知道 ...
- SQL server temporal table 学习笔记
refer: https://blog.csdn.net/Hehuyi_In/article/details/89670462 https://docs.microsoft.com/en-us/sql ...
- iManager微服务(云套件)配置https证书流程步骤
本文使用的是10.1版本,需要手动去配置证书,未来版本会考虑进行界面化配置. 一.提前准备 1. 证书需要准备三个文件 *.key *.crt *.keystore 2. 需要知道自己创建的微服务是哪 ...
- ceph-rbd和cephfs使用
目录 1 用户权限管理和授权流程 1.1 列出用户 1.2 用户管理 1.2.1 ceph auth add 1.2.3 ceph auth get-or-create 1.2.4 ceph auth ...
- SpringBoot.3中的aot.factories到底有什么用?和以前的spring.factories一样吗?
首先,我们来澄清一下 aot.factories 和 spring.factories 之间的区别.这两个文件不仅名称不同,而且在功能上也存在显著差异.接下来,我们将深入探讨这两个文件的具体作用以及它 ...
- 2023年1月中国数据库排行榜:OceanBase 持续两月登顶,前四甲青云直上开新局
一元复始,万象更新. 国产数据库在经历过耕获菑畲的一年后,产品.生态.人才队伍建设等都取得了重大的进展.2023年1月 墨天轮中国数据库流行度排行 火热出炉,本月排行榜"属性"列新 ...
- 45. beforeCreate和created的区别
data数据和methods的方法是否存在,是否定义了 : beforeCreate 都是 undefiend :
- Linux Ubuntu 安装Python独立的不同版本
由于Ubuntu系统默认的Python版本基本为3.5.2,老掉牙的版本了,很多功能语法不可以使用,删除也并不好操作.所以不如新装一个最新的版本.速度快,操作简单,最重要的是使用只需要键入python ...
- python机器学习(第一章 Python机器学习基础)
第一章 Python机器学习基础 基础: Python官网:https://www.python.org/doc/: 历史版本下载与维护信息:https://www.python.org/downlo ...