需求

A,B,C可并发运行,全部成功才算成功,一个失败全员回滚。

思考

使用CountDownLatch,可以保证三个线程结束后,才进行提交成功状态。但是怎么才能判断某个任务失败了呢?

  1. 捕获子线程异常?
  2. 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的并发需求的更多相关文章

  1. 不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator

    使用场景 在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同时对服务器发出太多请求(可能会 ...

  2. 一个WEB网站高并发量的解决方案

    一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...

  3. 飘逸的python - 解决一个有限制的组合需求

    假设有一个团队技能的需求. 这类技能是要集齐所有指定的人就能激活. 但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合. 这种组合跟普通组合不一样,普通组合可以随意组合.而这种组合是每 ...

  4. 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理

    在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...

  5. 在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?

    平时还是比较喜欢看书的..但有时候遇到问题还是经常感到脑袋一蒙..智商果然是硬伤.. 同事发现了个问题,代码如下: class Program { static void Main(string[] ...

  6. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

  7. 【2020】DBus,一个更能满足企业需求的大数据采集平台

    功能远超Sqoop.DataX.Flume.Logatash.Filebeat等采集工具 注:由于文章篇幅有限,完整文档可扫免费获取 深知其他组件的局限性,才能彰显DBus的优越感 当前有很多数据采集 ...

  8. 记一个关于std::unordered_map并发访问的BUG

    前言 刷题刷得头疼,水篇blog.这个BUG是我大约一个月前,在做15445实现lock_manager的时候遇到的一个很恶劣但很愚蠢的BUG,排查 + 摸鱼大概花了我三天的时间,根本原因是我在使用s ...

  9. 由一个滑动条的任务需求产生一个对UISlider控件的探讨

    任务需求样式:

  10. Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

    在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...

随机推荐

  1. 爬虫案例1-爬取图片的三种方式之一:selenium篇(2)

    @ 目录 前言 selenium简介 实战 共勉 ps 博客 前言 继使用requests库爬取图片后,本文使用python第三方库selenium来进行图片的爬取,后续也会使用同样是自动化测试工具D ...

  2. Facebook – Pixel

    介绍 Facebook 的 Pixel 类似于 Google 的 Analytics. 作用是 tracking 流量进入网站后是否转化. 这样就可以持续优化广告效果. 参考 Facebook Doc ...

  3. 大模型训练:K8s 环境中数千节点存储最佳实践

    今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的 KubeCon 中国大会上进行了该主题分享. Kubernetes 已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢.与此同时,人工智 ...

  4. IDEA如何查看每一行代码的提交记录(人员,时间)

    前言 我们在使用IDEA开发时,一般需要使用git来管理我们的代码,而且大家协同开发.   有时候,我们在开发的时候,经常需要看一下当前的代码时谁开发的,除了看类上面的作者外,更精细的方式是看每一行代 ...

  5. [namespace hdk] StringAddition_InFix

    namespace hdk{ const size_t fixsize=10000; class StringAddition_InFix{ private: string x="00&qu ...

  6. ARM SMMU的原理与IOMMU

    首先放一个社区iommupatch的网址:https://lore.kernel.org/linux-iommu/ 1: arm smmu的原理 1.1: smmu 基本知识 如上图所示,smmu 的 ...

  7. ftrace在应用上的使用

    之前介绍通过命令行配置和使用ftrace功能,但是实际中,我们也会希望抓C/C++程序中某段代码的调度情况.笔者前不久就遇到这种问题,某个函数调用时延概率超过100ms,是为什么?这时候就需要在他们代 ...

  8. 使用GrabCut做分割

    主要完成了界面化设计,代码如下 import cv2 as cv import numpy as np import sys from PyQt5.Qt import * class MyWedige ...

  9. dotnet封装一个配置工具类

    using Microsoft.Extensions.Configuration; namespace web.tools; public class settingHelper { public s ...

  10. C# 的显示转换 *.Parse(string) Convert.ToInt32(double value)

    // 显式转换 (类型) /// (int)表示使用强制的显示转换,是一种类型转换,C#默认的整形是 int32 , /// 因此使用此方法转成int32 不遵循四舍五入,直截取整数部分 /// (i ...