Runtime.AddShutdownHook(Thread) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
註冊一個新的虛擬機關機鉤子。
[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 所創建與分享的作品,並依授權條款所描述的使用進行修改。