日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程异常处理

發布時間:2023/12/10 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ??在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個線程需要自己把自己的checked exception處理掉。這一點是通過java.lang.Runnable.run()方法聲明(因為此方法聲明上沒有throws exception部分)進行了約束。但是線程依然有可能拋出unchecked exception,當此類異常跑拋出時,線程就會終結,而對于主線程和其他線程完全不受影響,且完全感知不到某個線程拋出的異常(也是說完全無法catch到這個異常)。JVM的這種設計源自于這樣一種理念:“線程是獨立執行的代碼片斷,線程的問題應該由線程自己來解決,而不要委托到外部。”基于這樣的設計理念,在Java中,線程方法的異常(無論是checked還是unchecked exception),都應該在線程代碼邊界之內(run方法內)進行try catch并處理掉.

public class ExeceptionThread implements Runnable {@Overridepublic void run() {throw new RuntimeException();}public static void main(String[] args) {try {ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new ExeceptionThread());} catch (Exception e) { //捕獲不了System.out.println("exeception has handled");}} } Exception in thread "pool-1-thread-1" java.lang.RuntimeExceptionat Thread.Exection.ExeceptionThread.run(ExeceptionThread.java:10)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

?

? ? ? 但如果線程確實沒有自己try catch某個unchecked exception,而我們又想在線程代碼邊界之外(run方法之外)來捕獲和處理這個異常的話,java為我們提供了一種線程內發生異常時能夠在線程代碼邊界之外處理異常的回調機制,即Thread對象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。

? ? ? 通過該方法給某個thread設置一個UncaughtExceptionHandler,可以確保在該線程出現異常時能通過回調UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法來處理異常,這樣的好處或者說目的是可以在線程代碼邊界之外(Thread的run()方法之外),有一個地方能處理未捕獲異常。但是要特別明確的是:雖然是在回調方法中處理異常,但這個回調方法在執行時依然還在拋出異常的這個線程中!另外還要特別說明一點:如果線程是通過線程池創建,線程異常發生時UncaughtExceptionHandler接口不一定會立即回調。

class ExceptionThread2 implements Runnable {public void run() {Thread t = Thread.currentThread();System.out.println("run() by " + t);System.out.println("eh=" + t.getUncaughtExceptionHandler());throw new RuntimeException();} }class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println("caught " + e);} }class HandlerThreadFactory implements ThreadFactory {@Overridepublic Thread newThread(Runnable r) {System.out.println(this + " creating new Thread");Thread t = new Thread(r);System.out.println("created " + t + " ID:" + t.getId());t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());System.out.println("eh=" + t.getUncaughtExceptionHandler());return t;} }public class CaptureUncaughtException {public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());exec.execute(new ExceptionThread2());} } Thread.Exection.HandlerThreadFactory@4e25154f creating new Thread created Thread[Thread-0,5,main] ID:9 eh=Thread.Exection.MyUncaughtExceptionHandler@70dea4e run() by Thread[Thread-0,5,main] eh=Thread.Exection.MyUncaughtExceptionHandler@70dea4e Thread.Exection.HandlerThreadFactory@4e25154f creating new Thread created Thread[Thread-1,5,main] ID:11 eh=Thread.Exection.MyUncaughtExceptionHandler@193fa958 caught java.lang.RuntimeException

默認方式:

public class SettingDefaultHandler {public static void main(String[] args) {Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//線程默認異常捕獲器類ExecutorService exec=Executors.newCachedThreadPool();exec.execute(new ExceptionThread2());} } run() by Thread[pool-1-thread-1,5,main] eh=java.lang.ThreadGroup[name=main,maxpri=10] caught java.lang.RuntimeException

?

? ? ? 比之上述方法,還有一種編程上的處理方式可以借鑒,即,有時候主線程的調用方可能只是想知道子線程執行過程中發生過哪些異常,而不一定會處理或是立即處理,那么發起子線程的方法可以把子線程拋出的異常實例收集起來作為一個Exception的List返回給調用方,由調用方來根據異常情況決定如何應對。不過要特別注意的是,此時子線程早以終結。

? ? ??Java thread里面關于異常的部分比較奇特。一般在線程里碰到checked exception,推薦的做法是采用try/catch塊來處理。而對于unchecked exception,比較合理的方式是注冊一個實現UncaughtExceptionHandler接口的對象實例來處理。

? ? ? 參考:http://www.cnblogs.com/zhuawang/p/3751875.html

? ? ? ? ? ? ??http://blog.csdn.net/bluishglc/article/details/8216824

轉載于:https://www.cnblogs.com/onlysun/p/4601430.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Java多线程异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。