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

问题

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


测试验证

我们用线程池执行任务一般有两种方式,一种是不需要返回结果的调用execute方法,一种是需要返回结果的调用submit方法。

  • excute方法测试
    调用executor方法执行线程不会吃掉异常
@Test
public void test0() {ExecutorService executorService = Executors.newFixedThreadPool(1);executorService.execute(() -> {System.out.println("子线程-begin");System.out.println(1 / 0);System.out.println("子线程-end");});System.out.println("主线程执行完成");
}

运行结果如下:有异常堆栈信息

主线程执行完成
子线程-begin
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zeroat com.zhouyong.practice.executor.ExecutorTest.lambda$test0$0(ExecutorTest.java:20)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)Process finished with exit code 0
  • submit方法测试
    线程池中的异常被吃掉-通过submit执行
@Test
public void test1() {ExecutorService executorService = Executors.newFixedThreadPool(1);executorService.submit(() -> {System.out.println("子线程-begin");System.out.println(1 / 0);System.out.println("子线程-end");});System.out.println("主线程执行完成");}

执行结果如下:没有异常堆栈信息(异常被吃掉)

子线程-begin
主线程执行完成Process finished with exit code 0

结论

调用线程池的submit方法执行线程时,异常处理的两种方式:

  1. 直接在线程run方法内部catch异常自行处理
@Test
public void test2(){ExecutorService executorService = Executors.newFixedThreadPool(1);executorService.submit(() -> {try {System.out.println("子线程-begin");System.out.println(1 / 0);System.out.println("子线程-end");} catch (Exception e) {//TODO 此处做日志记录或者打印异常堆栈   e.printStackTrace();}});System.out.println("主线程执行完成");
}

运行结果:
在这里插入图片描述


  1. 通过调用submit返回的Future对象做好异常处理

通过调用submit的返回值Future的get方法时会阻塞等待线程执行完成,如果有异常会抛出

@Test
public void test2() throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(1);Future<?> future = executorService.submit(() -> {System.out.println("子线程-begin");System.out.println(1 / 0);System.out.println("子线程-end");});//TODO 调用get方法时会等待线程执行,如果有异常会抛出,此处可以catch异常做日志记录 //由于get方法会阻塞主线程,因此最好也放在线程池中执行(调用execute方法即可)System.out.println(future.get());System.out.println("主线程执行完成");}

运行结果如下:
在这里插入图片描述

由于feture.get()方法会阻塞主线程,因此最好通过线程池执行

@Test
public void test4() {ExecutorService executorService = Executors.newFixedThreadPool(2);Future<?> future = executorService.submit(() -> {System.out.println("子线程-begin");System.out.println(1 / 0);System.out.println("子线程-end");});//由于get方法会阻塞主线程,因此最好也放在线程池中执行(调用execute方法即可)executorService.execute(()-> {try {future.get();} catch (Exception e) {//TODO 此处做日志记录或者打印异常堆栈 e.printStackTrace();}});System.out.println("主线程执行完成");
}

运行结果如下:
在这里插入图片描述




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

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

相关文章

〖Python网络爬虫实战㊸〗- 极验滑块介绍(五)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

光伏收益计算工具:助力可再生能源发展的关键

随着全球对可再生能源需求的不断增加&#xff0c;光伏发电作为清洁、可再生的能源形式&#xff0c;越来越受到人们的关注。然而&#xff0c;要评估光伏系统的经济效益和投资回报&#xff0c;需要一个准确的光伏收益计算工具。 光伏收益计算工具是一种专门用于计算光伏系统发电量…

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用 目前对选择秒那一列未禁用 <template><div><el-date-pickerv-model"deactivateTime"type"datetime"format"yyyy-MM-dd HH:mm:ss"value-format"yyyy-MM-dd HH…

MATLAB 点云中心化 (40)

MATLAB 点云中心化 一、算法介绍二、算法实现一、算法介绍 使用点云集合中的坐标计算质心,这里将其作为中心,将每个点坐标减去该中心坐标,即可得到中心化的点云,这在很多处理中是必须进行的一个步骤:相当于点云移动到以质心为原点的坐标系 (主要是计算质心和点云偏移两个…

带你学C语言~指针(2)

目录 &#x1f3c9;前言 &#x1f680; 数组名的理解 &#x1f680;使用指针访问数组 ✈一维数组传参的本质 ✈冒泡排序 &#x1f3c6;二级指针 &#x1f3c6;指针数组 &#x1f3c6;指针数组模拟二维数组 &#x1f389;结束语 &#x1f3c9;前言 上一章&#xff0c;小…

Java基础回顾——异常处理

文章目录 介绍语法抛出异常方法定义使用throws多catchfinally 自定义异常断言logging其他日志库commons loggingLog4j 介绍 一些错误是用户造成的&#xff08;类型输入错误&#xff09;&#xff0c;一些错误的随机出现&#xff08;网络终端、内存耗尽。。。&#xff09;&#…

20倍压缩比!微软提出大模型提示压缩框架LLMLingua

近期&#xff0c;越来越多研究在探索大型语言模型&#xff08;LLM&#xff09;在实际应用中的推理和生成能力。随着 ChatGPT 等模型的广泛研究与应用&#xff0c;如何在保留关键信息的同时&#xff0c;压缩较长的提示成为当前大模型研究的问题之一。 为了加速模型推理并降低成本…

题目讲解(1到5)

1 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 输入 #1复制 无 输出 #1复制 Hello,World! 这个不会写没啥讲的自裁吧,程序…

C : DS二叉排序树之删除(详细思路解答)

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

JS逆向实战——开发者工具检测

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景 在JS逆向领域&#xff0c;Chrome开发者工具是核心&#xff0c;抓包、调试、看调用栈等都离不开它。可以说&#xff0c;逆向人…

Linux基础入门笔记

Linux基础入门笔记&#xff0c;具体可见下载链接 大家阅读时可善用目录功能&#xff0c;可以提高大家的阅读效率 下载地址&#xff1a;Linux笔记 初始linux 操作系统&#xff1a;操作系统是用户和计算机硬件之间的桥梁&#xff0c;调度和管理计算机硬件进行工作常见操作系统 W…

【算法Hot100系列】删除链表的倒数第 N 个结点

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…