线程池异常堆栈的坑


import java.util.concurrent.*;

public class DivTask implements Runnable{
    int a,b;

    public DivTask(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void run() {
        double re = a/b;
        System.out.println(re);
    }
    public static void main(String[] args) throws InterruptedException, ExecutionException {
//        ThreadPoolExecutor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
//                , new SynchronousQueue<>());
        TraceThreadPoolExecutor executor = new TraceThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
                , new SynchronousQueue<>());  //扩展TraceThreadPoolExecutor
        for (int i = 0; i < 5; i++) {
            // executor.submit(new DivTask(100,i));
            //改进方式一:
            //Future re = executor.submit(new DivTask(100, i));
            //re.get();
            //改进方式二:
            executor.execute(new DivTask(100,i));
        }
        //100.0
        //25.0
        //33.0
        //50.0
        //其中100/0的异常结果没打印
        //线程池很有可能"吃掉程序抛出的异常

        //改进方式一:
        //Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
        //  at java.util.concurrent.FutureTask.report(FutureTask.java:122)
        //  at java.util.concurrent.FutureTask.get(FutureTask.java:192)
        //。。。

        //改进方式二:
        //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
        //  at com.Test.DivTask.run(DivTask.java:15)
        //  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        //  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        //  at java.lang.Thread.run(Thread.java:748)
        //100.0
        //33.0
        //25.0
        //50.0

        //扩展TraceThreadPoolExecutor
        //java.lang.Exception: Client stack trace
        //  at com.Test.TraceThreadPoolExecutor.clientTrace(TraceThreadPoolExecutor.java:20)
        //  at com.Test.TraceThreadPoolExecutor.execute(TraceThreadPoolExecutor.java:12)
        //  at com.Test.DivTask.main(DivTask.java:29)
        //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
        //  at com.Test.DivTask.run(DivTask.java:15)
        //  at com.Test.TraceThreadPoolExecutor.lambda$wrap$0(TraceThreadPoolExecutor.java:25)
        //  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        //  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        //  at java.lang.Thread.run(Thread.java:748)
        //100.0
        //25.0
        //33.0
        //50.0
    }
}

import java.util.concurrent.*;

/**
 * 扩展TraceThreadPoolExecutor,让它在调度任务前先保存一下提交任务线程的堆栈信息
 */
public class TraceThreadPoolExecutor extends ThreadPoolExecutor {
    public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    public void execute(Runnable task) {
        super.execute(wrap(task,clientTrace(),Thread.currentThread().getName()));
    }

    @Override
    public Future<?> submit(Runnable task) {
        return super.submit(wrap(task,clientTrace(),Thread.currentThread().getName()));
    }
    private Exception clientTrace(){
        return new Exception("Client stack trace");
    }
    private Runnable wrap(final Runnable task,final Exception clientTrace,String clientThreadName){
        return () -> {
            try {
                task.run();
            } catch (Exception e) {
                clientTrace.printStackTrace();
                throw e;
            }
        };
    }
}

转载于:https://www.cnblogs.com/fly-book/p/11464655.html

FISCO BCOS(八)——— 一键部署 WeBase 环境 版本 Java Oracle JDK 8 至 14 MySQL MySQL-5.6及以上 Python Python3.6及以上 PyMySQL 1、获取部署安装包: wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.4/webase-deploy.zip 2、解压安装包: unzip webase-deploy.zip 3、进入目录: c... 阅读详情

相关推荐

SAP打印错位问题终极解决指南:LP01设备格式设置全流程

本文详细解析了SAP系统中LP01设备打印错位问题的解决方案,重点介绍了SPAD事务码的配置流程和格式设置技巧。通过精准调整输出设备、设备类型和格式类型的匹配关系,有效解决'未定义格式'错误,确保打印内容准确对齐。文章还提供了高级排查方法和预防措施,帮助SAP管理员提升打印管理效率。

weixin_29311017的博客 390

【java基础】线程池的常见使用错误

若你发现博客内容有误,请及时在评论中指出

qq_43654226的博客 1082

三相电机控制入门:端电压、相电压、线电压到底怎么测?(附实测波形对比)

本文为三相电机控制初学者提供了端电压、相电压和线电压的完整测量指南。通过厘清三者的物理定义与测量方法,详细讲解了如何搭建虚拟星形点电路,并对比分析了方波、SPWM和SVPWM三种主流控制模式下关键电压波形的核心特征与差异,帮助工程师掌握正确的示波器测量与波形解读技巧。

oauth7security的博客 648

线程池实例

public Executor asyncServiceExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(10); //配置最大线程数 executor.setMaxPoolSize(80); //配置队列大小 executor.setQueueCapacity(1000); //配置线程池中的线程的名称前缀 executor.setT

liguoxiangzhizui的博客 416

原子力显微镜AFM图像处理软件Gwyddion使用教程(图文)

Gwyddion使用教程Gwyddion简介Gwyddion user guide下载地址本次教程用的AFM扫描图像下载地址AFM/STM校准样品Gwyddion使用step1step2step3step4step5step6step7step8你没见过的CD磁道到底长啥样一张图总结 Gwyddion简介        &nbs...

王纯配的博客 5万+

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1622

springboot中自定义线程池初始化时候coreSize大于maxPoolSize导致程序启动报错如下

2020-07-28 15:45:08,707 INFO [main] AnnotationConfigApplicationContext: Closing FeignContext-system-param-service-node: startup date [Tue Jul 28 15:45:07 CST 2020]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerAppli

qq_34412985的博客 1777

最新首发——boss直聘爬虫

本文介绍了使用Python开发Boss直聘爬虫的核心思路和技术要点。通过模拟浏览器访问搜索页面获取Cookie,然后构建API请求获取职位数据。关键步骤包括:1)使用DrissionPage库初始化浏览器;2)模拟用户浏览行为获取必要参数;3)设置完整的请求头信息;4)通过POST请求获取JSON格式的职位数据。文章提供了详细的代码实现,包括浏览器模拟、API请求构建、数据处理等核心功能模块,并强调了最新版接口改为POST访问的特点。该爬虫可自动翻页采集数据并保存为Excel文件,适用于安全实习等职位信息的

2301_79735033的博客 3317

android webservice抛出异常(已写了线程)

到底是什么鬼

jiangjianzi5819的博客 357

[RK3568 Android11] 开发之默认授予系统预置的APP权限

目录 一、系统预置的APP权限 二、默认授予系统预置的APP权限 一、系统预置的APP权限 1、在打开系统预置的APP时,都会弹窗提示,并且需要人工确定授予权限; 2、有些客户对定制有需求,需要系统预置的APP自动默认授予权限; 二、默认授予系统预置的APP权限 注意此方法只对系统预置的APP起效果,后期手动安装的APP无效; 修改文件: frameworks/base/services/core/java/com/android/server/pm/per...

~未来可期~ 5059

《低功耗方法学》翻译——卷首语

低功耗设计方法学。

记录所学,分享知识,结识挚友 991

Java 线程池中如何捕获堆栈异常

范例1:分母不能为0的异常没有抛出,程序竟然能成功地被执行 package com.myth; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Div...

zhengzizhi的专栏 867

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4054

HoRain云--Spring定时任务突然“罢工“?只执行一次的7大陷阱与解决方案

通过以上方案,某金融系统成功将定时任务稳定性从87%提升至99.99%。记住:定时任务不是配置完就万事大吉,需要持续监控和防护!

2401_86544677的博客 1005

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java CompletableFuture 原理与实践:从异步编程入门到高并发优化

Java 8引入的CompletableFuture通过CompletionStage接口解决了传统Future的三大痛点:无法回调、组合困难、错误处理分散。其核心原理包括异步任务编排、线程复用机制(同步完成时直接执行回调)和线程池策略(默认使用ForkJoinPool.commonPool())。实践上支持三种创建方式(异步启动、预完成实例、手动控制),并通过thenApply/thenCompose等方法实现链式组合。需注意默认线程池的局限性,建议关键任务使用自定义线程池以避免阻塞风险。

经天纬地,格物致理 375

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

分布式系统Stack Trace丢失与全链路追踪实践指南

在分布式系统中,错误堆栈(Stack Trace)是定位故障的关键线索,但跨服务调用时经常出现“no stack trace available”,导致排查陷入僵局。核心原因在于调用链是跨节点的,而堆栈信息却天然局限于进程内部。要解决这一问题,需要借助trace id与span id构建跨服务调用上下文,实现日志关联与堆栈聚合,并结合结构化日志、统一错误模型和链路追踪平台,还原完整故障现场。该方案适用于微服务、异步线程池、消息队列及跨语言调用等场景。本文从问题成因入手,逐步讲解上下文传递、日志聚合、异常上报

weixin_29574585的博客 291

线程池如何打印堆栈信息?

前言 本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定Java并发 正文 简单的例子 先从一个简单的例子入手,首先,我们有一个 Runnable 接口,它用来计算两个数的商。 public class DivTask implements Runnable { int a,b; public DivTask(int a,int b){ this.a=a;

Shockang的博客 7650

线程池中如何寻找堆栈?如何打印出堆栈的异常信息?

先由一个案例引入,来解释为什么要寻找线程池中的堆栈。 请看下面的一个简单案例,有一个Runable接口,用它来计算两个数的商。 public class DivTask implements Runnable { int a,b; public DivTask(int a, int b) { this.a = a; this.b = b; ...

qq_38658642的博客 1653

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

线程池常用问题 不允许使用的原因 测试流程 测试用例 抛出堆栈异常为啥对了一半? 怎么拿到submit的异常堆栈? 源码查看 执行executes方法时 执行submit方法时 不影响其他线程任务 这个线程会被放回线程池为啥错了 结论 1、当执行方式是execute时,可以看到堆栈异常的输出 2、当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常 3、不会影响线程池里面其他线程的正常执行 4、线程池会

LiZhen314的博客 5041

一篇文章带你优化线程池中线程的数量及在线程池中寻找堆栈

文章目录一、优化线程池线程数量二、在线程池中寻找堆栈 一、优化线程池线程数量 线程池的大小对系统的性能有一定的影响。过大或者过小的线程数量都无法发挥最优的系统性能,但是线程池大小的确定也不需要做得非常精确,因为只要避免极大和极小两种情况,线程池的大小对系统的性能并不会影响太大。一般来说,确定线程池的大小需要考虑CPU数量、内存大小等因素。在Java Concurrency inPractice一书中给出了估算线程池大小的公式: 为保持处理器达到期望的使用率,最优的线程池的大小等于:在Java中,可以通过如

南淮北安的博客 643

java 线程异常后怎么解决_一个线程池中的线程异常了,那么线程池会怎么处理这个线程?...

线程池常用问题了解JDK Executors线程池吗?知道JDK提供了哪些默认的实现吗?看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?线程池里面的任务是IO密集型的还是计算密集型的呢?好,现在我们有一个自定义线程池了,来说一下你这个线程池的工作流程呗?那你这...

weixin_39952074的博客 1181

线程池中的线程执行任务时遇到了异常,线程被销毁还是放回线程池重新利用呢?

原文点这里,我这做个备份。有的线程它死了,于是它变成一道面试题。 有些线程它活着,但它躺在池中碌碌无为; 有的线程它死了,于是它变成一道面试题。 这次的文章,要从一次阿里的面试说起。 我记得那天是周一,刚刚经历过周末过的放松,干劲十足的我正在键盘上疯狂的输出。这时,我的手机响了起来,拿起一看,是来自杭州的电话,心想这次是要给我推荐股票呢还是要让我贷款呢。我接起了电话,准备“调戏一番”。那边响起一个声音:"你好,请问是xxx吗?这边是杭州阿里巴巴,现在有时间进行电话面试吗?"。说实在的,听完这句话..

八荒六合唯我独尊 4216

java线程池执行任务时异常被吃掉

今天在测试环境通过线程池执行任务时突然被中断,跟踪日志发现代码跑到一半后面的日志就不再打印,而且也没有任何异常堆栈信息,也就是说程序执行被中断了,后面反复尝试经排查发现是线程池使用不当导致。

薛定谔的雄猫 1192

线程池扩展 - 快速定位异常任务的提交位置

线程池执行任务出现异常,会遗漏异常任务在哪里提交的日志打印,因此可以对线程池做扩展,在提交线程任务的时候,自己创建一个异常,保存调用的堆栈信息,如果任务执行失败,就将调用的堆栈信息也同时打印出来即可。

qq_45260619的博客 605

线程池的堆栈问题

看下面的例子: 复制代码 1 public class DivTask implements Runnable { 2 3 int a,b; 4 public DivTask(int a,int b){ 5 this.a = a; 6 this.b = b; 7 } 8 @Override 9 public void run() { 10 double re = a / b; 11 System.out.

Mars的专栏 484

线程池异常日志处理

线程池日志处理策略~

tianmlin1的博客 1709
上一篇: ThreadPoolExecutor扩展
下一篇: ForkJoinPool线程池--分支执行
dffxwe51549
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值