亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java線程池內(nèi)部任務(wù)出異常后發(fā)現(xiàn)異常的3種方法

 更新時間:2025年07月03日 09:11:17   作者:My?LQS  
Java線程池是一種并發(fā)編程工具,它允許開發(fā)者以線程池的形式重用線程,從而避免頻繁創(chuàng)建和銷毀線程所帶來的開銷,這篇文章主要給大家介紹了關(guān)于Java線程池內(nèi)部任務(wù)出異常后發(fā)現(xiàn)異常的3種方法,需要的朋友可以參考下

前言

在使用 Java 線程池(ThreadPoolExecutor) 進(jìn)行并發(fā)任務(wù)執(zhí)行時,默認(rèn)情況下 線程池不會直接報告某個線程發(fā)生了異常,這可能會導(dǎo)致問題難以排查。例如,任務(wù)拋出異常后,線程池可能會靜默失敗,甚至導(dǎo)致線程丟失。

那么,當(dāng)線程池內(nèi)部的任務(wù)發(fā)生異常時,我們?nèi)绾尾东@它,并知道具體是哪個線程出了問題呢?本文將介紹 3 種方法 來解決這個問題。

1. 自定義 ThreadFactory 并設(shè)置異常處理器

Java 提供了 UncaughtExceptionHandler,它允許我們在線程發(fā)生未捕獲異常時執(zhí)行自定義邏輯。我們可以自定義 ThreadFactory,為每個線程設(shè)置異常處理器,確保當(dāng)任務(wù)崩潰時能夠記錄具體的線程信息。

實(shí)現(xiàn)步驟

  • 自定義 ThreadFactory
  • 為線程設(shè)置 UncaughtExceptionHandler
  • 在異常發(fā)生時打印錯誤信息

示例代碼

import java.util.concurrent.*;

public class CustomThreadFactoryDemo {
    public static void main(String[] args) {
        ExecutorService executor = new ThreadPoolExecutor(
            2, 4, 0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(10),
            new CustomThreadFactory()
        );

        executor.execute(() -> {
            throw new RuntimeException("任務(wù)異常,測試線程異常處理!");
        });

        executor.shutdown();
    }

    // 自定義 ThreadFactory
    static class CustomThreadFactory implements ThreadFactory {
        private final ThreadFactory defaultFactory = Executors.defaultThreadFactory();

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = defaultFactory.newThread(r);
            thread.setUncaughtExceptionHandler((t, e) -> {
                System.err.println("線程 " + t.getName() + " 出現(xiàn)異常: " + e.getMessage());
            });
            return thread;
        }
    }
}

輸出

線程 pool-1-thread-1 出現(xiàn)異常: 任務(wù)異常,測試線程異常處理!

通過 UncaughtExceptionHandler,我們能夠捕獲到具體的 線程名稱 和 異常信息,方便排查問題。

2. 使用 Future 捕獲異常

如果你是通過 submit() 提交任務(wù),而不是 execute(),那么可以使用 Future 對象來捕獲異常。

實(shí)現(xiàn)步驟

  • 使用 submit() 方法提交任務(wù)(execute() 不會返回 Future)。
  • 通過 Future.get() 獲取結(jié)果,如果任務(wù)異常,會拋出 ExecutionException。
  • 在 catch 語句中提取具體的 線程信息 和 異常信息。

示例代碼

import java.util.concurrent.*;

public class FutureExceptionHandlingDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        Future<?> future = executor.submit(() -> {
            throw new RuntimeException("任務(wù)執(zhí)行失??!");
        });

        try {
            future.get(); // get() 方法會拋出異常
        } catch (InterruptedException | ExecutionException e) {
            System.err.println("線程 " + Thread.currentThread().getName() + " 捕獲到任務(wù)異常: " + e.getCause().getMessage());
        }

        executor.shutdown();
    }
}

輸出

線程 main 捕獲到任務(wù)異常: 任務(wù)執(zhí)行失敗!

優(yōu)點(diǎn)

  • submit() 返回 Future,不會導(dǎo)致線程池線程終止,可以繼續(xù)執(zhí)行其他任務(wù)。
  • Future.get() 同步等待任務(wù)完成,適用于需要獲取結(jié)果的場景。

3. 任務(wù)內(nèi)部手動捕獲異常并記錄

如果任務(wù)執(zhí)行過程中發(fā)生異常,我們可以 手動 try-catch 捕獲,然后記錄 線程信息,避免任務(wù)異常導(dǎo)致線程退出。

實(shí)現(xiàn)步驟

  • 在 run() 方法內(nèi)部使用 try-catch 捕獲異常。
  • 使用 Thread.currentThread().getName() 記錄當(dāng)前線程的異常信息。

示例代碼

import java.util.concurrent.*;

public class TryCatchExceptionHandlingDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        executor.execute(() -> {
            try {
                throw new RuntimeException("任務(wù)崩潰!");
            } catch (Exception e) {
                System.err.println("線程 " + Thread.currentThread().getName() + " 發(fā)生異常: " + e.getMessage());
            }
        });

        executor.shutdown();
    }
}

輸出

線程 pool-1-thread-1 發(fā)生異常: 任務(wù)崩潰!

優(yōu)點(diǎn)

  • 適用于業(yè)務(wù)邏輯層,任務(wù)內(nèi)部可以根據(jù)異常類型做不同處理。
  • 不會影響線程池的正常運(yùn)行,任務(wù)失敗后線程仍可復(fù)用。

總結(jié)

方案適用場景優(yōu)勢缺點(diǎn)
自定義 ThreadFactory + UncaughtExceptionHandler適用于 execute() 提交任務(wù)的情況可以直接捕獲線程異常,自動記錄線程信息僅適用于 execute(),不能用于 submit()
使用 Future 處理異常適用于 submit() 提交任務(wù)的情況get() 方法可以捕獲異常,不影響線程池運(yùn)行需要手動 get(),否則無法捕獲異常
任務(wù)內(nèi)部手動 try-catch適用于所有情況任務(wù)內(nèi)部可以靈活處理異常,保證線程池穩(wěn)定性需要開發(fā)者手動捕獲,可能會遺漏異常

在實(shí)際應(yīng)用中:

  • 如果你使用 execute() 提交任務(wù),推薦 自定義 ThreadFactory 設(shè)置異常處理器。
  • 如果你使用 submit() 提交任務(wù),建議 使用 Future 捕獲異常。
  • 如果你想完全控制異常,可以 在任務(wù)內(nèi)部 try-catch 處理。

到此這篇關(guān)于Java線程池內(nèi)部任務(wù)出異常后發(fā)現(xiàn)異常的3種方法的文章就介紹到這了,更多相關(guān)Java線程池內(nèi)部任務(wù)出異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合MD5加密完成注冊和登錄方式

    SpringBoot整合MD5加密完成注冊和登錄方式

    MD5(MessageDigestAlgorithm5)是一種常見的哈希算法,用于生成固定長度(128位)的哈希值,主要應(yīng)用于數(shù)據(jù)完整性校驗(yàn)和密碼存儲,MD5具有快速計算、不可逆性和抗碰撞性等特點(diǎn),盡管存在碰撞漏洞,MD5仍廣泛應(yīng)用于文件下載校驗(yàn)和數(shù)字簽名等場景
    2024-10-10
  • Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤解決辦法

    Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤

    這篇文章主要介紹了Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng)

    關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng)

    這篇文章主要介紹了關(guān)于Spring中@Transactional事務(wù)回滾的注意事項(xiàng),回滾(Rollback)指的是程序或數(shù)據(jù)處理錯誤,將程序或數(shù)據(jù)恢復(fù)到上一次正確狀態(tài)的行為?;貪L包括程序回滾和數(shù)據(jù)回滾等類型,需要的朋友可以參考下
    2023-05-05
  • 部署springboot項(xiàng)目到云服務(wù)器的兩種方式(jar+war)

    部署springboot項(xiàng)目到云服務(wù)器的兩種方式(jar+war)

    本文主要介紹了部署springboot項(xiàng)目到云服務(wù)器的兩種方式,主要介紹了jar和war兩種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java多線程異步調(diào)用性能調(diào)優(yōu)方法詳解

    Java多線程異步調(diào)用性能調(diào)優(yōu)方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java多線程異步調(diào)用性能調(diào)優(yōu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java向上轉(zhuǎn)型與向下轉(zhuǎn)型超詳細(xì)圖解

    Java向上轉(zhuǎn)型與向下轉(zhuǎn)型超詳細(xì)圖解

    我們在Java編程中經(jīng)常碰到類型轉(zhuǎn)換,對象類型轉(zhuǎn)換主要包括向上轉(zhuǎn)型和向下轉(zhuǎn)型,這篇文章主要介紹了Java向上轉(zhuǎn)型與向下轉(zhuǎn)型的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java基礎(chǔ)之ClassLoader詳解

    Java基礎(chǔ)之ClassLoader詳解

    這篇文章主要介紹了Java基礎(chǔ)之ClassLoader詳解,文中對ClassLoader有非常詳細(xì)的解說,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 在Spring Boot中實(shí)現(xiàn)文件上傳與管理的操作

    在Spring Boot中實(shí)現(xiàn)文件上傳與管理的操作

    在 Spring Boot 中實(shí)現(xiàn)文件上傳與管理非常簡單,通過配置文件上傳、創(chuàng)建文件上傳、下載、列表和刪除接口,我們可以輕松地處理文件操作,結(jié)合前端頁面,可以提供一個完整的文件管理系統(tǒng),這篇文章主要介紹了在Spring Boot中實(shí)現(xiàn)文件上傳與管理,需要的朋友可以參考下
    2024-07-07
  • Java算法之歸并排序舉例詳解

    Java算法之歸并排序舉例詳解

    這篇文章主要介紹了Java算法之歸并排序的相關(guān)資料,歸并排序是一種遞歸排序算法,通過將數(shù)組分成更小的子數(shù)組,遞歸地排序這些子數(shù)組,然后將它們合并成有序數(shù)組,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java實(shí)現(xiàn)帶緩沖的輸入輸出流

    Java實(shí)現(xiàn)帶緩沖的輸入輸出流

    本文詳細(xì)講解了Java實(shí)現(xiàn)帶緩沖的輸入輸出流,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論