线程池嵌套导致的死锁问题

1、背景

有一个报告功能,报告需要生成1个word,6个excel附件,总共7个文件,需要记录报告生成进度,进度字段jd初始化是0,每个文件生成成功进度加1,生成失败就把生成状态置为失败。

更新进度语句:update bg set jd = jd+1 where id = 'xx' 

上线一段时间后,很多报告进度都没有100%

2、问题排查

查看线上日志,发现生成附件2、附件3有时候会报错,然后对着报错改了代码,还是觉得有问题。因为看了代码,7个文件生成用的7个线程,每个结构都是try,catch,finnally,

看下面代码,感觉每个子线程都是走到finally里面,那就要么更新进度为100%,要么更新状态为失败

public void creatBgExcel(CreateBgWjPo createBgWjPo) {
..............................
        //附件1
        CompletableFuture<Void> task1 = CompletableFuture.runAsync(() -> {
            //新增数据excel,附件1
            createXzsjExcel(createBgWjPo, tempFileDir);
        }, threadPoolExecutor);

        //附件2
        CompletableFuture<Void> task2 = CompletableFuture.runAsync(() -> {
            //缺失数据excel,附件2
            createWtsjExcel(createBgWjPo, tempFileDir);
        }, threadPoolExecutor);

     ...............................
        CompletableFuture<Void> headerFuture = CompletableFuture.allOf(task1,task2 ,task3,.......);
        headerFuture.join();
        log.info("--bgId:{},excel报告单个附件已经全部生成", bgId);
    }

public void createWtsjExcel(CreateBgWjPo createBgWjPo, String tempFilePath) {log.info("--附件2,问题数据excel,开始生成数据,bgmc:{}", createBgWjPo.getGxZlbg().getBgmc());String exelxx = "";boolean isSucess = false;String msg = "";try{dosomething();isSucess = true;}catch (Exception e) {log.error("createWtsjExcel附件2生成失败,bgmc:{}",  createBgWjPo.getGxZlbg().getBgmc(),e);msg = "附件2生成excel失败.失败原因:{}" + e.getMessage();} finally {if (isSucess) {//更新进度gxZlbgMapper.updateBgJd(createBgWjPo.getGxZlbg().getId());} else {//更新状态bgZtToFail(createBgWjPo.getGxZlbg().getId(), msg, false, true);}}
}
(-)怀疑1,难道没有进入finally方法?
finanlly一般不执行的情况:
1、代码存在死循环
try{while(true){
}catch (Exception e) {} finally {
}
排查了代码,没有死循环,显然不适用。按理只要进入了子方法,肯定会进入finally。
排查线上日志docker logs -f --tail 100000 api-xx  grep 有问题的报告名称
发现: 有问题的报告名称,有些子文件没有打印出  开始生成数据的日志
结论: 有些报告生成的时候,根本没有进入对应的子方法
(2)排查方法外层代码ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8, 10,10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(Integer.MAX_VALUE));@Overridepublic SwaggerResultUtil<String> createZlbg(String bgId,boolean isReCreate) {CompletableFuture.runAsync(() -> {GxZlbg zlbg = new GxZlbg();zlbg.setId(bgId);//更新附件地址zlbg.setFjsczt(BgztEnum.DOING.getCode());zlbg.setWdsczt(BgztEnum.DOING.getCode());gxZlbgMapper.updateById(zlbg);CompletableFuture<Void> task1 = CompletableFuture.runAsync(() -> {//创建excelcreatBgExcel(result.getData());}, threadPoolExecutor);CompletableFuture<Void> task2 = CompletableFuture.runAsync(() -> {//创建wordcreateBgWord(result.getData());}, threadPoolExecutor);CompletableFuture<Void> headerFuture = CompletableFuture.allOf(task1, task2);headerFuture.join();}, threadPoolExecutor);return SwaggerResultUtil.resultSuccess();}

看到这段代码,发现存在线程池套线程池。

线程池8个,核心线程10个,问题分析

任务

外部线程

执行任务内部线程

备注

任务136里面子任务被执完成,外层的线程才会被释放
任务236
任务336

这样如果有3个报告同时生成,而且子文件方法耗时长,就会出现线程都被外部线程占用,内部无线程可用的状况,出现死锁,后续报告都无法开始生成。跟线上问题完全符合,应该就是发生了线程死锁

3、问题解决

不使用线程池套线程池的办法,把最外层方法指定线程池去掉threadPoolExecutor

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

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

相关文章

Win11系统变量打不开解决方法

Q&#xff1a; 下图所框选部分&#xff0c;变为灰色&#xff0c;点击不了 A: 1.可能是用户权限过低&#xff0c;升为管理员身份 按win R 调出运行&#xff0c;输入netplwiz 或 control userpasswords2效果都一样分别有两个组User和Administarations选中你的用户对应的组 …

3A开关降压型单节充电管理芯片CS5308D

CS5308D是一款30V耐压&#xff0c;单节锂电池或锂离子聚合物电池的降压型充电管理IC。集成功率MOS&#xff0c;芯片采用同步开关架构&#xff0c;使其在应用时仅需极少的外围器件&#xff0c;可有效减少整体方案尺寸&#xff0c;降低BOM成本。具有最大3A的充电电流能力&#xf…

华为云实验 -- 对云硬盘数据盘进行备份

文章目录 备份Linux系统备份1.购买Linux操作系统的ESC(云服务器)2.挂载数据盘--初始化--分区--格式化2.1.点击"远程登录"a.查看/dev/vdb数据盘b.新建主分区/dev/vdb1 2.2.查看新建分区大小,分区格式信息a.确定之前的分区操作是否正确b.确认完成后&#xff0c;将分区结…

Rust腐蚀服务器搭建架设教程ubuntu系统

Rust腐蚀服务器搭建架设教程ubuntu系统 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#xff0c;有一定电脑基础的小伙伴都知道Linux系统和windows系统相比较linux因为是面板…

小程序变更主体公证怎么做?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

STM32G030F6P6TR 芯片TSSOP20 MCU单片机微控制器芯片

STM32G030F6P6TR 在物联网&#xff08;IoT&#xff09;设备中的典型应用案例包括但不限于以下几个方面&#xff1a; 1. 环境监测系统&#xff1a; 使用传感器来监测温度、湿度、气压等环境因素&#xff0c;并通过无线通信模块将数据发送到中央服务器或云端平台进行分析和监控。…

探索RadSystems:低代码开发的新选择(三)

系列文章目录 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;一&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;二&#xff09;&#x1f6aa; 文章目录 系列文章目录前言一、RadSystems Studio是什么&#xff1f;二、操作日…

机器学习理论基础—神经网络算法公式学习

机器学习理论基础—神经网络公式学习 M-P神经元 M-P神经元&#xff08;一个用来模拟生物行为的数学模型&#xff09;&#xff1a;接收n个输入(通常是来自其他神经 元)&#xff0c;并给各个输入赋予权重计算加权和&#xff0c;然后和自身特有的阈值进行比较 (作减法&#xff0…

​「Python绘图」绘制小猪佩奇

python 绘制小猪佩奇 一、预期结果 二、核心代码 import turtle print("开始绘制小猪佩奇") pen turtle.Turtle() pen.pensize(4) #pen.hideturtle()pen.speed(1000)pen.color("#ff9bc0","pink") pen.setheading(-30) pen.pu() pen.goto(-100,…

LLM学习笔记-2

在未标记数据上进行预训练 本章概要 在上节的笔记中&#xff0c;因为训练出的效果&#xff0c;并不是特别理想&#xff0c;在本节中&#xff0c;会用数据进行训练&#xff0c;使得模型更加的好&#xff1b; 计算文本生成损失 inputs torch.tensor([[16833, 3626, 6100],…

ARP 攻击神器:ARP Spoof 保姆级教程

一、介绍 arpspoof是一种网络工具&#xff0c;用于进行ARP欺骗攻击。它允许攻击者伪造网络设备的MAC地址&#xff0c;以欺骗其他设备&#xff0c;并截获其通信。arpspoof工具通常用于网络渗透测试和安全评估&#xff0c;以测试网络的安全性和漏洞。 以下是arpspoof工具的一些…

TensorRT plugins and ONNX parser编译

https://github.com/NVIDIA/TensorRT是TensorRT plugins and ONNX parser&#xff0c;并不包含TensorRT的nvinfer库&#xff08;libinfer.so、nvinfer.dll&#xff09;&#xff0c;此部分并未开源&#xff0c;只能使用官方支持的平台、环境https://developer.nvidia.com/tensor…

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年&#xff0c;法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机&#xff0c;能以120帧/s的速度在一条纸膜上曝光照片&#xff0c;但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格&#xff0c;并且图像质量非常好。 受此启发&#xff0c;雷诺的…

【软件测试基础】黑盒测试(知识点 + 习题 + 答案)

《 软件测试基础持续更新中》 对于黑盒测试这一章&#xff0c;等价类划分、边界值测试、决策表、场景法&#xff0c;这四种是最容易出大题的&#xff0c;其他几种考察频率很低。下述的一些例题只是经典例题&#xff0c;掌握方法后&#xff0c;还要多加练习&#xff01; 目录 3…

极快!宝藏EI,2-4周录用,接受范围广!

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

短信视频提取批量工具,免COOKIE,博主视频下载抓取,爬虫

痛点&#xff1a;关于看了好多市面的软件&#xff0c;必须要先登录自己的Dy号才能 然后找到自己的COOKIE 放入软件才可以继续搜索&#xff0c;并且无法避免长时间使用 会导致无法正常显示页面的问题。 有没有一种方法 直接可以使用软件&#xff0c;不用设置的COOKIE的方法呢 …

文献速递:肺癌早期诊断---利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊

Title 题目 A 3D Probabilistic Deep Learning System forDetection and Diagnosis of Lung Cancer Using Low-Dose CT Scans 利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊 01文献速递介绍 肺癌既是最常见的癌症之一&#xff0c;也是导致癌症死亡的主要原因之…

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…

Docker容器:镜像与容器管理命令

目录 一、镜像管理命令 1、搜索镜像 2、获取镜像 3、镜像加速下载 4、查看下载的镜像文件信息 5、查看下载到本地的所有镜像 6、获取指定镜像的详细信息 7、为本地的镜像添加新的标签 8、删除镜像 8.1 删除指定的镜像 8.2 批量删除多个镜像 9、导出镜像与导入镜像 …

Day 32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

买卖股票的最佳时期Ⅱ 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你…