語言

Runtime.AddShutdownHook(Thread) 方法

定義

註冊一個新的虛擬機關機鉤子。

[Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")]
public virtual void AddShutdownHook(Java.Lang.Thread? hook);
[<Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")>]
abstract member AddShutdownHook : Java.Lang.Thread -> unit
override this.AddShutdownHook : Java.Lang.Thread -> unit

參數

hook
Thread

一個已初始化但尚未啟動 Thread 的物件

屬性

例外狀況

如果鉤子已經開始,還是已經被登記過。

如果虛擬機已經在關機。

備註

註冊一個新的虛擬機關機鉤子。

Java 虛擬機會因兩種事件而關閉

<UL>

<li> 程式正常 退出 ,當最後一個非守護程序執行緒退出或 #exit exit 呼叫(等價的) System#exit(int) System.exit方法時,或

<li> 虛擬機會在使用者中斷(如打字)或系統性事件(如使用者登出或系統關機)時^C

</ul>

關機鉤子只是初始化但未啟動的執行緒。 當虛擬機開始關機序列時,會以未指定順序啟動所有註冊的關機鉤子,並讓它們同時執行。 當所有鉤子都掛完後,它就會停止。 請注意,守護進程執行緒在關機序列中會繼續執行,非守護程序執行緒若透過呼叫 #exit exit 該方法啟動關機,執行緒也會持續執行。

一旦關機序列開始,只能透過呼叫 #halt halt 該方法來停止,強制終止虛擬機器。

一旦關機序列開始,就無法註冊新的關機鉤子,也無法取消先前註冊的鉤子。 嘗試這兩種操作中的任何一項都會被 IllegalStateException 擲出。

關閉鉤子在虛擬機器生命週期中處於微妙階段,因此應以防禦性方式編碼。 它們特別應該寫成執行緒安全,並盡可能避免死結。 他們也不應盲目依賴可能已註冊關閉掛鉤的服務,因此自己可能正處於關閉過程中。 嘗試使用其他基於執行緒的服務,例如AWT事件-派遣執行緒,可能會導致死結。

關閉鉤也應該能迅速完成它們的工作。 當程式呼叫 #exit exit 時,預期虛擬機會立即關閉並退出。 當虛擬機因使用者登出或系統關機而終止時,底層作業系統可能只允許有限的時間來關閉和退出。 因此,不建議嘗試任何使用者互動或在關機鉤子中執行長時間運算。

未捕捉的例外在關機鉤子中處理,就像其他執行緒一樣,透過呼叫 ThreadGroup#uncaughtException uncaughtException 執行緒 ThreadGroup 物件的方法來處理。 此方法的預設實作會將例外的堆疊追蹤列印到 System#err 並終止執行緒;這不會導致虛擬機器退出或停止。

在罕見情況下,虛擬機可能會 中止,也就是說,在未乾淨關機的情況下停止運行。 當虛擬機在外部終端時,例如訊號在 Unix 上或SIGKILL呼叫TerminateProcess在 Microsoft Windows 時,就會發生這種情況。 如果原生方法出錯,例如破壞內部資料結構或嘗試存取不存在的記憶體,虛擬機也可能中止。 若虛擬機中止,則無法保證是否會執行關機鉤子。

在 1.3 版本中加入。

java.lang.Runtime.addShutdownHook(java.lang.Thread)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於