【并发编程】线程池任务抛异常会怎么样?

一、先说结论

得看线程池的实现,JUC 的线程池(ThreadPoolExecutor)的话

  1. 不会影响其他的线程
  2. 若是 submit 方法,或者任务为 future 任务,异常只有在 get 的时候才会抛出
  3. 若是 execute + runnable 任务,异常就会抛出,线程挂掉后,线程池移除该线程并创建一个新的线程

若通过 submit 提交任务,会将任务封装到 future 里面或者原任务本身就是 future 任务,而 future 的 run 方法执行的时候,抛出的异常在其内部会被捕获,等到 get 方法的时候才会抛出。

execute + runnable,并没有涉及 future,虽然异常会被捕获,但也以为被重新抛出,导致线程中断,线程池需要移除线程,并创建新的线程

二、submit、execute 方法

在这里插入图片描述

在这里插入图片描述

线程运行任务核心代码

final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w.unlock(); // allow interruptsboolean completedAbruptly = true;try {while (task != null || (task = getTask()) != null) {w.lock();// If pool is stopping, ensure thread is interrupted;// if not, ensure thread is not interrupted.  This// requires a recheck in second case to deal with// shutdownNow race while clearing interruptif ((runStateAtLeast(ctl.get(), STOP) ||(Thread.interrupted() &&runStateAtLeast(ctl.get(), STOP))) &&!wt.isInterrupted())wt.interrupt();try {beforeExecute(wt, task);try {task.run();afterExecute(task, null);} catch (Throwable ex) {afterExecute(task, ex);throw ex;}} finally {task = null;w.completedTasks++;w.unlock();}}completedAbruptly = false;} finally {processWorkerExit(w, completedAbruptly);}
}

三、异常处理

比较全面的处理,主要是,afterExecute 方法,这个哪怕抛出异常也会执行

new ThreadPoolExecutor(IO_CORE,IO_MAX,KEEP_ALIVE_SECOND,TimeUnit.SECONDS,// 任务队列存储超过核心线程数的任务new LinkedBlockingDeque<>(QUEUE_SIZE),r -> {Thread thread = new Thread(r);thread.setDaemon(Boolean.TRUE);thread.setName(String.format("%s, message-process-thread-%d", threadName, NUM.getAndIncrement()));return thread;}
) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {// 若 t 不为 null,正常处理if (Objects.nonNull(t)) {log.error(t.getMessage());}// 特别注意的是 futureTask 在 run 的时候不会立即抛异常,而是吞掉,在调用 get 的时候才能抛出// 如果是 submit 提交,原本的任务被封装成 futureTask,异常不会在 t 里,而是在 futureTask 里(但原本的任务是 futureTask 的话,则应该是原本的任务 get 的时候才会抛异常)// 如果是 execute,则 r 还是原来的任务,但不排除 r 本来就是 futureTask,那么其错误信息本来就应该通过 get 获取,在这里处理一下也无妨,不影响原本的处理结果即可// 原任务为 futureTask 的时候,get 时一定要处理异常if (r instanceof Future<?> futureTask) {try {futureTask.get();} catch (Exception e) {log.error(e.getMessage());}}}
};
log.info("线程池已经初始化");
EXECUTOR.allowCoreThreadTimeOut(Boolean.TRUE);
// JVM 关闭时的钩子函数
Runtime.getRuntime().addShutdownHook(new ShutdownHookThread("IO 密集型任务线程池", (Callable<Void>) () -> {shutdownThreadPoolGracefully(EXECUTOR);return null;})
);

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

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

相关文章

本地部署deepseek-r1 ollama+anythingllm

本期笔者带给大家部署一个本地私有化知识库&#xff0c;简单明了&#xff0c;直接步入主题&#xff0c;需要读者可以继续关注支持一下啊&#xff01; 目录 背景步骤 一、环境准备二、Ollama环境部署三、AnythingLLM安装 总结 开始下载应用&#xff1a; 操作系统&#xff1a…

JAVA-Exploit编写(13-15)--JAVAFX-GUI检测工具编写实现

目录 一,JAVAFX-GUI单个漏洞检测编写 1.1 绑定事件 1.2 Thinkphp5_Rce编写 1.3 编写利用类 1.4 Thinkphp2x_Rce编写 1.5 单个漏洞检测GUI工具完整代码 二,JAVAFX-GUI单个漏洞批量检测编写 2.1 编写利用反射类 2.2 批量检测漏洞完整GUI工具代码 三,JAVAFX-GUI…

mysql-Innodb记录结构深度解析

Innodb记录结构 InnoDB记录结构深度解析一、InnoDB存储基础单元&#xff1a;页&#xff08;Page&#xff09;二、行格式&#xff08;Row Format&#xff09; 三、核心行格式详解1. Compact行格式结构组成&#xff1a; 2. Redundant行格式&#xff08;兼容旧版本&#xff09;核心…

Deepin(Linux)安装MySQL指南

1.下载 地址&#xff1a;https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压&#xff0c;本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…

ZT9 游游的字母翻倍

描述 游游拿到了一个长度为n的字符串&#xff0c;她每次操作会选择一个区间[l,r]&#xff0c;将第l个字母到第r个字母各重复一次&#xff0c;插入到该字母的后面。 例如&#xff0c;对于字符串"abcd"&#xff0c;若选择区间[2,3]进行操作&#xff0c;字符串将变成&qu…

Visual Studio更新说明(关注:.NET+AI生产力)

Ver V0.0&#xff1a;Visual Studio 2022 v17.12更新:.NET9AI生产力 AI插件推荐 &#xff08;1&#xff09;腾讯云AI代码手&#xff08;内含了DeepSeek-R1&#xff09;&#xff0c;目前免费&#xff0c;但收费我也可能会买。 AI插件!推荐 &#xff08;1&#xff09;百度的…

C++ 设计模式-访问者模式

C++访问者模式 一、模式痛点:当if-else成为维护噩梦 开发动物园管理系统,最初的需求很简单: class Animal {}; class Cat : public Animal {}; class Dog : public Animal {};// 处理动物叫声 void makeSound(Animal* a) {if (auto c = dynamic_cast<Cat*>(a)) {st…

QEMU源码全解析 —— 内存虚拟化(17)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型

java基于数组实现队列(四)

概述 实现我上一篇博客中提到的 实际上&#xff0c;就是用synchronized代码块解决线程安全问题&#xff0c;以及利用wait()、notify()实现线程阻塞、唤醒。 实现 pollV3() private Object lockBySynchronizednew Object();public int pollV3() {synchronized (lockBySynchr…

linux -对文件描述符的操作dup、fcntl有五种

dup #include<unistd.h> int dup(int oldfd);作用&#xff1a;复制一个新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt从空闲的文件描述符表中找一个最小的作为新的拷贝的文件描述符返回&#xff1a;成功返回新的文件描述符&#xff0c;失败…

DeepSeek各模型现有版本对比分析

文章目录 一、基础模型系列&#xff1a;V1 到 V3 的演进二、专用模型系列&#xff1a;推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型&#xff0c;本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…

深入解析:在Spring Boot中集成MyBatis Plus实现高效数据库操作

前后端微服务商城项目&#xff0c;手把手教学&#xff01; 在Spring Boot中集成第三方框架&#xff0c;实际上是非常常见的一种做法。Spring Boot自带了很多开箱即用的功能&#xff0c;但在实际项目开发中&#xff0c;我们经常需要借助一些第三方框架来实现更为复杂的功能。比如…

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能&#xff0c;每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容&#xff0c;屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便&#xff0c;而…

项目管理工具Jira在营销工作管理中的应用与实践

本文由Atlassian全球白金合作伙伴-龙智编辑整理。 市场营销人员是维系组织团结的粘合剂。作为公司中最具协作精神的团队之一&#xff0c;他们确保每个人目标一致&#xff0c;并专注于客户真正的需求。他们擅长沟通协作&#xff0c;积极响应客户诉求及塑造品牌方向&#xff0c;…

grafana 忘记登陆密码

重置 Grafana 登录密码 通过命令行重置 admin 密码 # 如果是通过二进制安装的 Grafana grafana-cli admin reset-admin-password <新密码>

基于Flask框架的食谱数据可视化分析系统的设计与实现

【Flask】基于Flask框架的食谱数据可视化分析系统的设计与实现 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 在当今数字化时代&#xff0c;信息可视化已成为一种高效的数据理解和传播手段。…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数

ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

开源项目 botgroup.chat 介绍 AI 多人聊天室&#xff1a; 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用&#xff0c;支持多个 AI 角色同时参与对话&#xff0c;提供类似群聊的交互体验。体验地址&#xff1a;https://botgroup.chat 开源仓库&#x…

GPU和FPGA的区别

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;和 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;不是同一种硬件。 我的理解是&#xff0c;虽然都可以用于并行计算&#xff0c;但是GPU是纯计算的硬件…

详解单例模式、模板方法及项目和源码应用

大家好&#xff0c;我是此林。 设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式&#xff0c;可以避免重复解决相同类型的问题&#xff0c;使我们能够更加专注于具体的业务逻辑&#xff0c;减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。…