24 執行緒管理 執行緒的未捕獲異常與監控

2021-09-11 11:38:55 字數 1291 閱讀 2438

如果執行緒的 run 方法丟擲未**獲的異常,那麼隨著 run 方法的退出,相應的執行緒也提前終止。對於執行緒的這種異常終止,如何得知並做出可能的補救動作,例如重新建立並啟動乙個替代執行緒呢?jdk 1.5 為了解決這個問題引入了uncaughtexceptionhandler介面。該介面是在 thread 類內部定義的,它只定義了乙個方法:

void

uncaughtexception

(thread t, throwable e)

設thread 為任意乙個執行緒,eh為任意乙個uncaughtexceptionhandler例項,那麼我們可以在啟動 thread 前通過呼叫thread.setuncaughtexceptionhandler(eh)來為thread關聯乙個uncaughtexceptionhandler。當 thread 丟擲未**獲的異常後 thread.run() 返回,接著 thread 會在其終止前呼叫eh.uncaughtexception方法 。

uncaughtexceptionhandler.uncaughtexception 方法是執行在丟擲異常 e 的執行緒 t 之中的,在執行 uncaughtexceptionhandler.uncaughtexception 方法的時候執行緒 t 還是存活的 (live), uncaughtexceptionhandler.uncaughtexception 方法返回之後執行緒 t 就終止了。

執行緒組本身也實現了 uncaughtexceptionhandler 介面 。 如果乙個執行緒沒有關聯的

uncaughtexceptionhandler 例項,那麼該執行緒異常終止前其所屬執行緒組的uncaughtexception 方法會被呼叫。執行緒組的 uncaughtexception 方法會呼叫其父執行緒組的uncaughtexception 方法並傳遞同樣的兩個引數(t 和 e)。如果乙個執行緒組沒有其父執行緒組,那麼執行緒組的 uncaughtexception 方法會呼叫預設 uncaughtexceptionhandler 的uncaughtexception 方法來處理執行緒的異常終止 。預設 uncaughtexceptionhandler 適用於所有執行緒,即任何乙個執行緒異常終止時預設 uncaughtexceptionhandler 都有可能會被呼叫thread.setdefaultuncaughtexceptionhandler 方法可用來指定預設uncaughtexceptionhandler。uncaughtexceptionhandler 例項的選擇優先順序如下圖所示 。

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

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

未捕獲的異常

現在,你應該有怎樣的例外工作合理的想法。在這節課中,我們將覆蓋更多的一些有趣的例外情況。未捕獲的異常 在過去的幾個例子,有相當多的情況下,函式假定其呼叫者 或另乙個函式在呼叫堆疊 處理的例外。在下面的例子中,假設有人會mysqrt 處理異常,但如果沒有人把究竟發生了什麼?這是我們的平方根程式再次,減...

多執行緒之執行執行緒異常捕獲

description 執行緒異常捕捉 author administrator create 2019 12 23 22 22 public class threadexception static void thread1 catch interruptedexception e thread....