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.mzph.cn/news/233828.shtml

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

相关文章

网络的发展历史,ip地址

TCP/IP 是获得最广泛支持的通信协议集合 包含了大量internet应用的标准协议 -支持跨网络架构&#xff0c;跨操作系统平台的通信 主机与主机之间通信的三个要素 1.ip地址(ip address) 2.子网掩码(subent mask) 3.ip路由(ip router) ip地址&#xff1a; 作用&#xff1a;用…

【深度学习】语言模型与注意力机制以及Bert实战指引之一

文章目录 统计语言模型和神经网络语言模型注意力机制和Bert实战Bert 统计语言模型和神经网络语言模型 区别&#xff1a;统计语言模型的本质是基于词与词共现频次的统计&#xff0c;而神经网络语言模型则是给每个词赋予了向量空间的位置作为表征&#xff0c;从而计算它们在高维…

mutable property that could have been changed by this time

情形&#xff1a; 网络请求json数据&#xff0c;本地创建实体类接收json&#xff0c;实体类中的变量为var可变类型&#xff0c;将实体类的变量赋值给一个局部变量&#xff0c;将局部变量作为参数传给其它方法时&#xff0c;遇到一个问题 &#xff1a; ”Smart cast to String …

【从服务器获取共享列表失败】【无法与设备或资源通信】解决方案!

【从服务器获取共享列表失败】背景&#xff1a; 某项目搭建有samba共享&#xff0c;使用一段时间后&#xff0c;不知何种原因&#xff0c;客户端链接共享时报&#xff1a;从服务器获取共享列表失败&#xff0c;无效的参数。 可参考解决方案A&#xff1a; 银河麒麟samba共享文…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解&#xff0c;它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean&#xff0c;例如Import(AService.class)&#xff0c;就会生成AService的bean&#xff0…

scala学习五:字符串

一、字符串 Scala中的字符串类型实际上是Java String&#xff0c;它本身没有String Scala中&#xff0c;string是不可变对象&#xff0c;不可修改。如果修改字符串&#xff0c;会产生新的字符串对象 1.1 Scala字符串 创建字符串实例 var greeting Hello World var greetin…

综合物业服务标书:打造舒适宜居的生活环境

综合物业服务标书&#xff0c;是指为了竞标或招投标而编写的综合物业服务方案书。综合物业服务标书是物业管理公司向业主委托方展示自身实力和服务水平的重要文件&#xff0c;也是获得物业管理合同的关键。 一、综合物业服务的定义 综合物业服务是指物业管理公司为业主提供的…

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式&#xff0c;一直没有怎么深入了解&#xff0c;最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能&#xff0c;在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…

【华为数据之道学习笔记】5-11 算法模型设计

算法是指训练、学习模型的具体计算方法&#xff0c;也就是如何求解全局最优解&#xff0c;并使得这个过程高效且准确&#xff0c;其本质上是求数学问题的最优化解&#xff0c;即算法是利用样本数据生成模型的方法。算法模型是根据业务需求&#xff0c;运用数学方法对数据进行建…

小程序使用web-view无法打开该H5页面不支持打开的解决方法

我在正式上线版小程序使用 web-view 组件测试时提示&#xff1a;“无法打开该页面&#xff0c;不支持打开 https://xxxxxx&#xff0c;请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 奇怪的是&#xff0c;“真机调试”、“开发模式”都可以使用 web-view 组件访…

面试题总结(五)【线程的同步和互斥】【华清远见西安中心】

线程的同步实现方式有几种&#xff0c;区别是什么&#xff1f; 线程的同步可以使用多种方式来实现&#xff0c;常见的包括互斥量、条件变量、原子操作、信号量等。它们的区别主要体现在实现机制、适用场景和性能特点上。 1. 互斥量&#xff08;Mutex&#xff09;&#xff1a;互…

易优建站修改文章模板中的地图大小

我是新建了一个栏目放置的百度地图 然后再这个栏目下创建地图 然后再页面中添加代码标签&#xff0c;显示地图&#xff0c;其实就是显示文章的内容 接下来就是修改地图的大小 第一步&#xff1a;打开文件public/plugins/Ueditor/dialogs/map/show.html 第二步&#xff1a;打开…

从西工大安全事件浅谈特权账号管理系统

去年9月&#xff0c;国家计算机病毒应急处理中心发布《西北工业大学遭美国NSA网络攻击事件调查报告&#xff08;之一&#xff09;》&#xff08;以下简称“西工大事件报告”&#xff09;&#xff0c;以充分详实的证据揭示了美国NSA使用41种武器&#xff0c;先后使用了遍布17个国…

Wireshark在网络性能调优中的应用

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…

长短期记忆(LSTM)神经网络-多输入回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编…

数据可视化Seaborn

数据可视化Seaborn Seaborn简介Seaborn API第一个Seaborn应用Seaborn基本概念Seaborn图表类型Seaborn数据集Seaborn样式Seaborn调色板Seaborn分面网格Seaborn统计图表Seaborn散点图Seaborn折线图Seaborn柱状图Seaborn箱线图Seaborn核密度估计图Seaborn分类散点图Seaborn回归分…

AI降重工具

WEB版 体验一下 from docx import Document import requestsdef call_api_and_get_content(content, prompt):api_url "http://XXXXXXXX/api?content" content promptresponse requests.get(api_url)if response.status_code 200:api_result response.text.re…

el-select如何去掉placeholder属性

功能要求是&#xff1a;当el-select的disabled属性为true的时候不展示“请选择”字样 1、要去掉 el-select 元素的 placeholder 属性&#xff0c;可以在代码中将其设置为空字符串。 <el-select placeholder"" ...></el-select> 注意&#xff1a;这种方…

1_js基本简介数据类型变量的使用

1. 编程语言简介 1.1 计算机编程语言 计算机编程语言是程序设计的最重要的工具&#xff0c;它是指计算机能够接受和处理的、具有一定语法规则的语言。从计算机诞生&#xff0c;计算机语言经历了机器语言、汇编语言和高级语言几个阶段。 高级语言&#xff1a;JavaScript&#x…

el-select二次封装实现可分页加载数据

使用el-select时一次性渲染几百条数据时会造成页面克顿, 可以通过分页来实现, 这里我用的方式为默认获取全部数据, 然后一次性截取10条进行展示, 滚动条触底后会累加, 大家也可以优化为滚动条触底后发送请求去加载数据 创建自定义指令customizeFocus用户懒加载 在utils文件夹(…