Java多線程之多線程異常捕獲。本站提示廣大學習愛好者:(Java多線程之多線程異常捕獲)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程之多線程異常捕獲正文
一:為何要零丁講多線程的異常捕獲呢?
先看個例子:
public class ThreadException implements Runnable{ @Override public void run() { throw new RuntimeException(); } //景象:掌握台打印出異常信息,並運轉一段時光後才停滯 public static void main(String[] args){ //就算把線程的履行語句放到try-catch塊中也杯水車薪 try{ ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new ThreadException()); }catch(RuntimeException e){ System.out.println("Exception has been handled!"); } } }
在run中手動拋出了一個運轉時異常,在main中啟動線程,catch語句塊中捕獲下異常,捕獲到打印一句話。運轉成果以下圖:
發明異常被拋到了掌握台,沒有打印catch塊中的語句。
結論:多線程運轉不克不及依照次序履行進程中捕捉異常的方法來處置異常,異常會被直接拋出到掌握台(因為線程的實質,使得你不克不及捕捉從線程中逃逸的異常。一旦異常逃逸出義務的run辦法,它就會向別傳播到掌握台,除非你采取特別的情勢捕捉這類異常。),如許會讓你很頭疼,沒法捕獲到異常就沒法處置異常而激發的成績。
因而,我們必定會想若何在多線程中捕獲異常呢?
2、多線程中捕獲異常
我們來依照上面的步調完成此次試驗:
1.界說異常處置器
請求,完成 Thread.UncaughtExceptionHandler的uncaughtException辦法,以下:
/* * 第一步:界說相符線程異常處置器標准的“異常處置器” * 完成Thread.UncaughtExceptionHandler標准 */ class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{ /* * Thread.UncaughtExceptionHandler.uncaughtException()會在線程因未捕捉的異常而鄰近逝世亡時被挪用 */ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("caught "+e); } }
2.界說應用該異常處置器的線程工場
/* * 第二步:界說線程工場 * 線程工場用來將義務附著給線程,並給該線程綁定一個異常處置器 */ class HanlderThreadFactory implements ThreadFactory{ @Override public Thread newThread(Runnable r) { System.out.println(this+"creating new Thread"); Thread t = new Thread(r); System.out.println("created "+t); t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//設定線程工場的異常處置器 System.out.println("eh="+t.getUncaughtExceptionHandler()); return t; } }
3.界說一個義務,讓其拋出一個異常
/* * 第三步:我們的義務能夠會拋出異常 * 顯示的拋出一個exception */ class ExceptionThread implements Runnable{ @Override public void run() { Thread t = Thread.currentThread(); System.out.println("run() by "+t); System.out.println("eh = "+t.getUncaughtExceptionHandler()); throw new RuntimeException(); } }
4.挪用試驗
/* * 第四步:應用線程工場創立線程池,並挪用其execute辦法 */ public class ThreadExceptionUncaughtExceptionHandler{ public static void main(String[] args){ ExecutorService exec = Executors.newCachedThreadPool(new HanlderThreadFactory()); exec.execute(new ExceptionThread()); } }
運轉成果以下圖:
3、結論
在java中要捕獲多線程發生的異常,須要自界說異常處置器,並設定到對應的線程工場中(即第一步和第二步)。
4、拓展
假如你曉得將要在代碼中處處應用雷同的異常處置器,那末更簡略的方法是在Thread類中設置一個靜態域,並將這個處置器設置為默許的未捕捉處置器。
這個處置器只要在不存在線程專有的未捕捉異常處置器的情形下才會被挪用。
public static void main(String[] args){ Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); ExecutorService exec =Executors.newCachedThreadPool(); exec.execute(new ExceptionThread()); }
以上就是本文針對Java多線程之多線程的異常捕獲的全體內容,本文若有懂得毛病處所,迎接批駁糾正。