【异常】捕获线程池执行任务时产生的异常

前言:

        在编写程序时,我们为了充分利用多核CPU、加快接口响应速度,通常会使用线程池来处理请求,但线程池执行任务过程中难免会出现异常,导致请求失败。那如果我们想在任务发生异常后捕获异常,并做一些”善后“操作,该如何做呢?

捕获方案:

        1、try、catch:

public class ExceptionHandle {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(1,2,30,TimeUnit.SECONDS,new LinkedBlockingQueue<>());executor.execute(() -> {try {//模拟业务代码出现异常int i = 1 / 0;}catch (Exception e){System.err.println(e.getMessage());}});executor.shutdown();}
}

        原理:在编码时提前预知业务代码可能会发生异常,并用try块捕获业务异常,并在catch块做善后工作。        

        2、FutureTask:

public class ExceptionHandle {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(1,2,30,TimeUnit.SECONDS,new LinkedBlockingQueue<>());Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {//模拟业务代码出现异常return 1/0;}};FutureTask<Integer> task = new FutureTask<Integer>(callable);executor.submit(task);try {task.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {//这里捕获的是真正的业务异常System.err.println(e.getCause().getMessage());}executor.shutdown();}
}

       原理:FutureTask技能作为任务提交给线程执行,也能像Future一样通过get()方法获取任务执行结果。如果任务正常执行,那么返回的就是结果对象,如果执行出现异常,返回的就是异常对象;当发生异常时,try块就能捕获异常,并在catch块做相应处理。get()方法实现如下

//可能会抛出InterruptedException、ExecutionException
public V get() throws InterruptedException, ExecutionException {int s = state;if (s <= COMPLETING)s = awaitDone(false, 0L);return report(s);}

        InterruptedException是线程在等待执行结果时,被其它线程打断所产生的异常。

        用Future接口获取submit()方法的返回结果也能达到同样的效果,对FutureTask不太了解的话,可以看我的这篇博客:【Java】浅析FutureTask的核心方法get-CSDN博客

        3、ThreadFactor:

​
public class ExceptionHandle {public static void main(String[] args) {//线程工厂用于给线程池创建的线程加上一些特征//你可以通过线程工厂指定线程的优先级、是否是守护线程等等ThreadFactory factory = new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r);//t.setUncaughtExceptionHandler((Thread thread,Throwable e) -> {if(e != null){System.err.println(e.getMessage());}});return t;}};ThreadPoolExecutor executor = new ThreadPoolExecutor(1,2,30,TimeUnit.SECONDS,new LinkedBlockingQueue<>(),factory);executor.execute(() -> {//模拟业务异常int i = 1/0;});executor.shutdown();}
}​

        原理:

        (1)ThreadFactor接口用于声明线程的属性,如线程的优先级、名称、守护进程状态等,它是线程池的构造参数之一;如果创建线程池时传入了ThreadFactor,线程池在创建线程时会按照ThreadFactor指定的形式来创建。

        (2)我们让线程调用了setUncaughtExceptionHandler()方法,这个方法需要一个参数:UncaughtExceptionHandler接口,当线程由于未捕获的异常而突然终止时,会调用这个接口的uncaughtException()方法,我们可以自定义这个方法的实现逻辑,对异常做处理。相当于线程执行任务过程中如果出现异常,那么就会回调uncaughtException()方法,如下图所示。

        如果本文对你有所帮助,不妨点个赞支持一下!

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

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

相关文章

12.03 二叉树简单题2

257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&q…

Matlab数学建模详解之发电机的最佳调度实现

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&am…

洛谷 P5708:三角形面积 ← Python 及 C++ 代码比较

【题目来源】https://www.luogu.com.cn/problem/P5708【题目描述】 一个三角形的三边长分别是 a, b, c&#xff0c;请利用海伦公式计算三角形的面积。 计算结果四舍五入&#xff0c;精确到 1 位小数。【输入格式】 第一行输入三个实数 a, b, c&#xff0c;以空格隔开。【输出格…

智能优化算法应用:基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子搜索算法4.实验参数设定5.算法结果6.参考…

主键虽两个字,但含义丰富;创建新表,Access会自动创建主键,但也可以手动设置

主键是一种特殊类型的索引字段&#xff0c;用于唯一标识表中的每个记录或行。每个主键值必须是表中唯一一个此类主键值。创建新表时&#xff0c;Access会自动创建具有字段名ID和自动编号数据类型的主键。 你需要了解的有关主键的一些信息 一个表只能有一个主键。 主键字段中…

DevEco Studio设置背景图片

我们打开编辑器 左上角菜单 选择 File 下的 Settings 我们选择首选项 Appearance 8 Behavior 下的 Appearance 右侧界面 点击下面的 Background lmage… 新弹出的这个窗口 我们可以鼠标 拖拽它的边 把他拉大一点 当前 我们代码中是没有背景图片的 我们点击入下图指向的三个…

网页表格复制器(油猴插件脚本)

网页表格复制器&#xff08;油猴插件脚本&#xff09; 测试表格 Column 1Column 2Column 3Column 4文本居中文本居右文本居左默认test1-1test1-2test1-3test1-4test2-1test2-2test2-3test2-4 脚本代码 // UserScript // name 网页表格复制器 // namespace http:…

【LangChain实战】开源模型学习(2)-ChatGLM3

介绍 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型&#xff0c;在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上&#xff0c;ChatGLM3-6B 引入了如下特性&#xff1a; 更强大的基础模型&a…

关于业界大语言模型(LLM)开源的一些看法

近期看到阿里开源了720亿参数模型通义千问&#xff0c;已实现“全尺寸、全模态”开源&#xff0c;对这个动作的一些想法&#xff0c;包括好处和缺点 国内大语言模型的开源有许多好处&#xff0c;如下&#xff1a; 1. 提升技术水平&#xff1a;国内大语言模型开源可以使更多的…

Sun Apr 16 00:00:00 CST 2023格式转换

Date date new Date(); log.info("当前时间为:{}",date); //yyyy-MM-dd HH:mm:ss SimpleDateFormat sdf new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); String dateTime s…

leetCode 51.皇后 + 回溯算法 + 图解 + 笔记

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。每一种解法包…

SpringBoot MyBatis连接数据库 查询数据(注解方式)

创建项目时选择依赖 配置数据库连接 在resources中的 application.properties 配置文件进行连接的配置 #驱动名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver#连接地址 spring.datasource.urljdbc:mysql://10.20.22.11:26954/canteen#数据库用户名 spring.d…

ios 逆向分分析,某业帮逆向算法(二)

接上讲 上次hook 发现自己的数据有点问题。才发现是自己的编辑器识别出问题了。 上篇sub_1029B6898函数hook数据如下: [iOS Device::作业帮 ]-> arg2: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 00000000 37 32 65 64 38 31 32 38…

Docker下搭建MySQL主从复制

目录 主从复制简介 主从复制搭建 主从复制简介 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff0c;主数 据库一般是准实时的业务数据库。 主从复制的作用 做数据的热备。作为后备数据库&#xff0c;主数据库服务器故…

Spring Task 定时任务框架

Spring Task Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 Spring Task使用步骤 1). 导入maven坐标 spring-context&#xff08;已存在&#xff…

DLL缺失

DLL缺失 参考链接&#xff1a; 方法五&#xff0c;亲测有用

LeetCode417. Pacific Atlantic Water Flow

文章目录 一、题目二、题解 一、题目 There is an m x n rectangular island that borders both the Pacific Ocean and Atlantic Ocean. The Pacific Ocean touches the island’s left and top edges, and the Atlantic Ocean touches the island’s right and bottom edges…

VLAN实验

题目要求 1.PC1和PC3所在接口为Access接口 2.PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6PC4可以访问PC5,但不能访问PC6PC5不能访问PC6 3.PC1/3与PC2/4/5/6不在同一网段 4.所有PC通过DHCP获取IP地址&#xff0c;且PC1/3可以正常访问PC2/4/5/6题目分析 1.将交换…

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解&#xff1a;控制器跳转与作用域&#xff08;一&#xff09; SpingMVC中…