捕獲非同步執行緒異常的常用方式

2021-10-05 16:13:25 字數 2425 閱讀 3059

宣告開啟執行緒的方式

使用執行緒池的情況

捕獲非同步執行緒異常的常用方式

thread

不使用執行緒池1.thread.setdefaultuncaughtexceptionhandler設定預設的執行緒異常處理器。

2.thread例項.setuncaughtexceptionhandler給當指定執行緒設定執行緒異常處理器。

thread

使用執行緒池executorservice#execute1.thread.setdefaultuncaughtexceptionhandler設定預設的執行緒異常處理器。

2.自定義threadpoolexecutor, 重寫afterexecute方法,在afterexecute方法中感知異常。

3.自定義threadfactory, 重寫newthread方法,給執行緒工廠生產出來的thread例項設定uncaughtexceptionhandler

thread

使用執行緒池executorservice#submit自定義threadpoolexecutor, 重寫afterexecute方法,在afterexecute方法中感知異常。

runnable

不使用執行緒池1.thread.setdefaultuncaughtexceptionhandler設定預設的執行緒異常處理器。

2.thread例項.setuncaughtexceptionhandler給當指定執行緒設定執行緒異常處理器。

runnable

使用執行緒池executorservice#execute1.thread.setdefaultuncaughtexceptionhandler設定預設的執行緒異常處理器。

2.自定義threadpoolexecutor, 重寫afterexecute方法,在afterexecute方法中感知異常。

3.自定義threadfactory, 重寫newthread方法,給執行緒工廠生產出來的thread例項設定uncaughtexceptionhandler

runnable

使用執行緒池executorservice#submit自定義threadpoolexecutor, 重寫afterexecute方法,在afterexecute方法中感知異常。

callable

不使用執行緒池在使用future#get()方法獲取callable#call()的返回結果時, try-catch獲取異常

注:此方式,若不使用future#get()獲取結果,那麼 非同步執行緒的異常資訊將會被吞掉。

callable

使用執行緒池executorservice#submit自定義threadpoolexecutor, 重寫afterexecute方法,在afterexecute方法中感知異常。

提示

thread不使用執行緒池

thread使用執行緒池executorservice#execute

thread使用執行緒池executorservice#submit

runnable不使用執行緒池

runnable使用執行緒池executorservice#execute

runnable使用執行緒池executorservice#submit

callable不使用執行緒池

callable使用執行緒池executorservice#submit

^_^ 如有不當之處,歡迎指正

^_^ 測試**託管鏈結

^_^ 本文已經被收錄進《程式設計師成長筆記》,筆者justrydeng

執行緒池中捕獲執行緒執行異常

在專案中使用執行緒池時,使用了如下方式 executorservice datauploadpool executors.newfixedthreadpool writethreadnum datauploadpool.execute new thread task 但是這種方式下,主線程無法捕獲子...

Task異常捕獲的幾種方式

wait result 在呼叫task的wait 方法或result屬性處會丟擲task中的異常。使用continuewith捕獲異常 如果不可以在內部捕獲,可以使用continuewith 方法捕獲異常 var t task.run continuewith t1 return t1 unwrap...

如何主線程捕獲子執行緒的異常

第乙個 子執行緒類 public class threadexceptionrunner implements runnable 第二步 主線程類 在最後面有我自定義的兩個class是作為配置用的,有解釋 public class demothread 1 首先 實現乙個 thread.uccaug...