Java基礎(chǔ)-線程-線程的異常處理

Java工程師知識樹 / Java基礎(chǔ)


線程的異常處理

setDefaultUncaughtExceptionHandler():設(shè)置當(dāng)線程由于未捕獲到異常而突然終止足删,并且沒有為該線程定義其他處理程序時所調(diào)用的默認(rèn)處理程序。Thread.setDefaultUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler())

線程異常處理實(shí)例
package com.thread.study;

import org.slf4j.Logger;

import static org.slf4j.LoggerFactory.getLogger;

public class ThreadException {
    /** 日志 */
    private static final Logger LOGGER = getLogger(ThreadException.class);

    public static void main(String[] args) {
        //異常不處理
        new Thread(() -> {
            int i = 1/0;
        }, "張三").start();

        //在線程內(nèi)異常處理
        new Thread(() -> {
            try {
                int i = 1/0;
            } catch (Exception e) {
                LOGGER.error("線程發(fā)生了異常野舶,線程內(nèi)處理", e);
            }
        }, "李四").start();

        // 在線程外處理異常
        try {
            new Thread(() -> {
                int i = 1/0;
            }, "王五").start();
        } catch (Exception e) {
            LOGGER.error("線程發(fā)生了異常蒜焊,線程外處理", e);
        }

        // 自定義線程異常處理異常
        Thread thread = new Thread(() -> {
            int i = 1/0;
        },"趙六");
        thread.setUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler());
        thread.start();
    }

}


// 自定義線程異常
class ThreadUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

    /** 日志 */
    private static final Logger LOGGER = getLogger(ThreadUncaughtExceptionHandler.class);

    /**
     * Thread t  發(fā)生異常的線程
     * Throwable e  發(fā)生的異常
     */
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        LOGGER.error("線程發(fā)生了異常喳坠,自定義處理构回。{}", t, e);
    }
}

打印結(jié)果
Exception in thread "張三" java.lang.ArithmeticException: / by zero
    at com.thread.study.ThreadException.lambda$main$0(ThreadException.java:14)
    at java.lang.Thread.run(Thread.java:745)
Exception in thread "王五" java.lang.ArithmeticException: / by zero
    at com.thread.study.ThreadException.lambda$main$2(ThreadException.java:29)
    at java.lang.Thread.run(Thread.java:745)
主線程執(zhí)行完了
10:32:02.518 [李四] ERROR com.thread.study.ThreadException - 線程發(fā)生了異常谷炸,線程內(nèi)處理
java.lang.ArithmeticException: / by zero
    at com.thread.study.ThreadException.lambda$main$1(ThreadException.java:20)
    at java.lang.Thread.run(Thread.java:745)
10:32:02.518 [趙六] ERROR com.thread.study.ThreadUncaughtExceptionHandler - 線程發(fā)生了異常,自定義處理畦徘。Thread[趙六,5,main]
java.lang.ArithmeticException: / by zero
    at com.thread.study.ThreadException.lambda$main$3(ThreadException.java:37)
    at java.lang.Thread.run(Thread.java:745)
線程異常處理總結(jié):
  1. 線程中如果發(fā)生異常毕籽,不處理與在線程外處理效果是一樣的。
  2. 線程中如果發(fā)生異常井辆,在線程中處理可以捕捉到異常关筒,線程的異常不影響其他線程的執(zhí)行。
  3. 線程中如果發(fā)生異常杯缺,使用線程內(nèi)的try...catch和自定義異常都是可以處理的蒸播,并可以獲取線程內(nèi)的異常信息。
  4. 線程內(nèi)的try...catch和自定義異常處理異常的區(qū)別在于萍肆,線程內(nèi)的try...catch只能針對一個線程袍榆,自定義異常可以針對一組線程塘揣。
線程通過Future的get方法捕獲異常
package com.thread.study;

import org.slf4j.Logger;

import java.util.concurrent.*;

import static org.slf4j.LoggerFactory.getLogger;

public class ThException {

    /** 日志 */
    private static final Logger LOGGER = getLogger(ThreadException.class);

    public static void main(String[] args) {

        // 線程通過Future的get方法捕獲異常
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Future<Object> future = executorService.submit(new Callable() {
            @Override
            public String call() throws Exception {
                int i = 1 / 0;
                return "線程通過Future創(chuàng)建線程";
            }
        });
        try {
            String reStr = (String) future.get();
            System.out.println(reStr);
        } catch (InterruptedException | ExecutionException e) {
            LOGGER.error("線程發(fā)生了異常包雀,線程通過Future的get方法捕獲異常", e);
        }
        executorService.shutdown();

        System.out.println("主線程執(zhí)行完了");
    }
}
// 打印結(jié)果
/*
11:10:41.841 [main] ERROR com.thread.study.ThreadException - 線程發(fā)生了異常,線程通過Future的get方法捕獲異常
java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.thread.study.ThException.main(ThException.java:26)
Caused by: java.lang.ArithmeticException: / by zero
    at com.thread.study.ThException$1.call(ThException.java:21)
    at com.thread.study.ThException$1.call(ThException.java:18)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
主線程執(zhí)行完了
*/
通過Future的get方法處理總結(jié):

submit之后可以獲得一個線程執(zhí)行結(jié)果的Future對象勿负,而如果子線程中發(fā)生了異常馏艾,通過future.get()獲取返回值時劳曹,可以捕獲到ExecutionException異常奴愉,從而知道子線程中發(fā)生的異常信息。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铁孵,一起剝皮案震驚了整個濱河市锭硼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜕劝,老刑警劉巖檀头,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轰异,死亡現(xiàn)場離奇詭異,居然都是意外死亡暑始,警方通過查閱死者的電腦和手機(jī)搭独,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廊镜,“玉大人牙肝,你說我怎么就攤上這事∴推樱” “怎么了配椭?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雹姊。 經(jīng)常有香客問我股缸,道長,這世上最難降的妖魔是什么吱雏? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任敦姻,我火速辦了婚禮,結(jié)果婚禮上歧杏,老公的妹妹穿的比我還像新娘替劈。我一直安慰自己,他們只是感情好得滤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布陨献。 她就那樣靜靜地躺著,像睡著了一般懂更。 火紅的嫁衣襯著肌膚如雪眨业。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天沮协,我揣著相機(jī)與錄音龄捡,去河邊找鬼。 笑死慷暂,一個胖子當(dāng)著我的面吹牛聘殖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播行瑞,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼奸腺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了血久?” 一聲冷哼從身側(cè)響起突照,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氧吐,沒想到半個月后讹蘑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體末盔,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年座慰,在試婚紗的時候發(fā)現(xiàn)自己被綠了陨舱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片濒析。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡夹纫,死狀恐怖绰寞,靈堂內(nèi)的尸體忽然破棺而出卷要,到底是詐尸還是另有隱情跪解,我是刑警寧澤兴使,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布米酬,位于F島的核電站佃蚜,受9級特大地震影響蝉揍,放射性物質(zhì)發(fā)生泄漏链峭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一又沾、第九天 我趴在偏房一處隱蔽的房頂上張望弊仪。 院中可真熱鬧,春花似錦杖刷、人聲如沸励饵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽役听。三九已至,卻和暖如春表窘,著一層夾襖步出監(jiān)牢的瞬間典予,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工乐严, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘤袖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓昂验,卻偏偏與公主長得像捂敌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子既琴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一占婉、前言 線程池技術(shù)是服務(wù)器端開發(fā)中常用的技術(shù)。不論是直接還是間接呛梆,各種服務(wù)器端功能的執(zhí)行總是離不開線程池的調(diào)度锐涯。...
    幽瀾先生閱讀 875評論 0 0
  • 一磕诊、前言 線程池技術(shù)是服務(wù)器端開發(fā)中常用的技術(shù)填物。不論是直接還是間接纹腌,各種服務(wù)器端功能的執(zhí)行總是離不開線程池的調(diào)度。...
    編走編想閱讀 5,259評論 4 10
  • 異常滞磺,說起來升薯,就是一張圖,5個關(guān)鍵字击困。 一張圖涎劈, 5個關(guān)鍵字 try catch finally throw th...
    阿敏其人閱讀 593評論 0 2
  • Java異常處理機(jī)制,帶你走進(jìn)程序員的完美世界阅茶。 Error類程序無法處理的錯誤蛛枚,其超出了應(yīng)用程序的控制和處理能力...
    采風(fēng)JS閱讀 376評論 0 42
  • 1.子線程中try... catch... 最簡單有效的辦法,就是在子線程的執(zhí)行方法中脸哀,把可能發(fā)生異常的地方蹦浦,用t...
    ZhaoJw_44b1閱讀 146評論 0 0