【并發編程】線程池任務拋異常會怎么樣?

一、先說結論

得看線程池的實現,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.pswp.cn/news/896192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896192.shtml
英文地址,請注明出處:http://en.pswp.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;減少重復勞動。設計模式在定義系統結構時通常考慮到未來的擴展。…