1. 程式人生 > >Java多執行緒之捕獲子執行緒中的異常

Java多執行緒之捕獲子執行緒中的異常

在某些場景下,我們經常需要使用多執行緒來執行任務提高效能,但是我們知道正常的主執行緒是無法處理子執行緒的異常的,一旦出現異常就會傳播到控制檯。這個時候我們需要線上程裡面處理異常怎麼辦呢,我們可以使用Executor來處理。

在Java5中新加入了一個Thread.UncaughtExceptionHandler介面,這個介面可以讓我們在每個Thread物件上都附著一個異常處理器,它的unacughtException()方法執行緒因未捕獲的異常而死亡時被呼叫。

首先我們我們先實現Thread.UncaughtExceptionHandler介面:

class myUncaughtExceptionhandler implements 
Thread.UncaughtExceptionHandler{//實現執行緒異常處理介面 @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("cause"+ e); } }
      我們在自定義一個執行緒工廠:
class HandlerThreadFactory implements ThreadFactory{

    @Override
public Thread newThread(Runnable r) {
        System.out
.println(this+"create new thread"); Thread t = new Thread(r); System.out.println("create"+t); t.setUncaughtExceptionHandler(new myUncaughtExceptionhandler());//設定我們自定義的異常處理 //Thread.setDefaultUncaughtExceptionHandler();也可使用此方法設定預設的處理器 System.out.println("eh="+t.getUncaughtExceptionHandler()); return
t; } }
最後我們實現一個Runnable介面,並在run方法中丟擲一個異常:
class MyThread implements Runnable {
    @Override
public void run() {
        Thread t = Thread.currentThread();
System.out.println("run()"+ t);
System.out.println("eh="+t.getUncaughtExceptionHandler());
        throw new RuntimeException();
}
}
ok,我們再寫個main方法來測試一些:
public static void main(String[] args){
    ExecutorService exe = Executors.newCachedThreadPool(new HandlerThreadFactory());//使用我們自定義的ThreadFactory
exe.execute(new MyThread());
}
執行結果如下圖所示:

[email protected] new thread
createThread[Thread-0,5,main]
[email protected]
run()Thread[Thread-0,5,main]
[email protected]
[email protected] new thread
createThread[Thread-1,5,main]
[email protected]
causejava.lang.RuntimeException

很明顯,程式可以執行,說明異常被捕獲了,並且也是我們所丟擲的異常,希望對大家有所幫助。

相關推薦

Java線程捕獲線程異常---面試經

正常的 current service handle AD 希望 article 程序 UNC 在某些場景下,我們經常需要使用多線程來執行任務提高性能,但是我們知道正常的主線程是無法處理子線程的異常的,一旦出現異常就會傳播到控制臺。這個時候我們需要在線程裏面處理異常怎麽辦呢

Java執行捕獲執行異常

在某些場景下,我們經常需要使用多執行緒來執行任務提高效能,但是我們知道正常的主執行緒是無法處理子執行緒的異常的,一旦出現異常就會傳播到控制檯。這個時候我們需要線上程裡面處理異常怎麼辦呢,我們可以使用E

[轉]Java執行如何捕獲執行丟擲的異常

這麼來看待這個問題。首先明確執行緒程式碼的邊界。其實很簡單,Runnable介面的run方法所界定的邊界就可以看作是執行緒程式碼的邊界。Runnable介面中run方法原型如下:     <<             public   void   run();

java給出一個主執行如何捕獲執行異常的例子

馬克-to-win:首先我們看主執行緒如何捕獲子執行緒的異常 例:1.5.4-本章原始碼 import java.lang.Thread.UncaughtExceptionHandler; class ThreadMark_to_win extends Thread { public void run() {

Java執行interrupt()和執行終止方式

1. interrupt()說明 在介紹終止執行緒的方式之前,有必要先對interrupt()進行了解。 關於interrupt(),java的djk文件描述如下:http://docs.oracle.com/javase/7/docs/api/ Interrupts this thread

java執行callable+Executor執行池例項

package main.java; import java.sql.Time; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.con

JAVA執行當一個執行執行死迴圈時會影響另外一個執行嗎?

一,問題描述 假設有兩個執行緒在併發執行,一個執行緒執行的程式碼中含有一個死迴圈如:while(true)....當該執行緒在執行while(true)中程式碼時,另一個執行緒會有機會執行嗎? 二,示例程式碼(程式碼來源於網際網路) 1 public class Service { 2

JAVA執行兩個執行同時寫一個檔案

1.多執行緒        執行緒是程式執行流的最小單元。是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行

[Java][Android] 執行同步-主執行等待所有執行完成案例

有時候我們會遇到這樣的問題:做一個大的事情可以被分解為做一系列相似的小的事情,而小的事情無非就是引數上有可能不相同而已! 此時,如果不使用執行緒,我們勢必會浪費非常多的時間來完成整個大的事情,而使用執行緒的話將會存在這樣的問題: 主執行緒啟動所有子執行緒併發執行後主執行緒就

java執行Runnable同時執行同一資源例項

這是個賣票例項,採用多執行緒,模擬不同視窗來賣票,票數是共同資源。 piao.java package tong; public class piao implements Runnable { private static int count = 10;

Java執行"事件分發執行"----Event Dispatch Thread

當執行GUI小程式(Applet)或應用程式(Application)時,main()方法中的程式碼會建立一個GUI並設定事件控制代碼.當呼叫Frame,Dialog,Window的setVisible(true)或瀏覽器顯示Applet時,我們就是在和GUI互動.   問題

Jni 執行程式設計,執行回撥java方法

由於c++層接收到服務端主動推送tcp資料,所以存在將c++層接收到的socket資料通過層層回撥至java的需求。 以下為c++程式碼段: 1:在c++標頭檔案中定義申明相應回撥函式指標 typedef void (*SwitchStateC

【小家javaJava執行(父執行)與執行的通訊和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

Android複習旅--執行更新UI

Android4.0版本後耗時的操作(比如請求網路,下載檔案等)不能在UI主執行緒執行,而且子執行緒也不能直接更新UI介面。而現實的場景確是子執行緒在下載檔案的同時UI介面能顯示相應的進度資訊,既然有了需求,那肯定就會有解決方案。 Android提供了Handler訊息機制和Asyn

C# 執行List的執行安全問題

網上關於List的執行緒安全問題將的很少,所以自己實驗了一把,發現確實是執行緒不安全的.所以當你在進行多執行緒程式設計中使用了共享的List集合,必須對其進行執行緒安全處理. List的Add方法是執行緒不安全的,List的原始碼中的Add方法,使用了每次噹噹前的元素達到上限,通過建立一個新的陣列例項,並給

java執行等待所有執行執行完畢在執行(常見面試題)

java主執行緒等待所有子執行緒執行完畢在執行,這個需求其實我們在工作中經常會用到,比如使用者下單一個產品,後臺會做一系列的處理,為了提高效率,每個處理都可以用一個執行緒來執行,所有處理完成了之後才

java學習筆記——springaop、切面類五種通知的使用、存在個切面類時切面通知的執行順序、註釋的方式定義切面類與通知、xml配置的方式定義切面類與通知

3、AOP AOP:(Aspect Oriented Programming)面向切面程式設計; OOP:(Object Oriented Programming )面向物件程式設計; 面向切面程式設計:基於OOP基礎之上新的程式設計思想; 指在程式執行期間,

執行使用者級執行切換隨筆

執行緒及切換執行緒:比程序更輕的動態執行序列,同一程序中的多個執行緒可以共享資源(記憶體),故執行緒間的切換相比程序更加快速、方便。執行緒的切換:是指令之間的切換,從一段執行序列(程式)切換到另一段執行序列(程式),而記憶體對映表不變;即PC的切換,執行緒的切換也是程序切換的

java執行結束和執行結束之間的關係

情況1:正常情況下,主執行緒啟動了子執行緒,主執行緒、子執行緒各自執行,彼此不受影響。 當你在run一個Java application的時候,這個時候系統會開一個程序。然後這個程序啟動了Main執行緒。Java程序確定虛擬機器中沒有執行緒執行的時候,退出程序。或者也可以用

JAVA執行等待所有執行執行完成後主執行執行

         如標題,此功能主要是JDK1.5引入的java.util.concurrent包下的CountDownLatch類,此類據介紹為以執行緒輔助類,通過執行緒計數器來實現一個或多個主執行緒等待其下所有子執行緒執行完後主執行緒再繼續執行的功能。