我有一個關於Runtime.getRuntime().addShutdownHook()
的問題。當ShutdownHook被調用?
假設我有兩個以main開頭的線程。兩個線程都在處理一個集合,即List<String> commonColection
。
當我按Ctrl+C
我想保存這個集合。我的問題是:線程在ShutdownHooks被調用之前停止,還是需要顯式終止我的線程,然後保存我的集合?
我有一個關於Runtime.getRuntime().addShutdownHook()
的問題。當ShutdownHook被調用?
假設我有兩個以main開頭的線程。兩個線程都在處理一個集合,即List<String> commonColection
。
當我按Ctrl+C
我想保存這個集合。我的問題是:線程在ShutdownHooks被調用之前停止,還是需要顯式終止我的線程,然後保存我的集合?
當虛擬機開始關閉序列,它會以某種未指定的順序啓動 所有已註冊的關閉掛鉤,並讓它們同時運行 。當所有掛鉤完成後,它將運行 所有未引用的終結器,如果已啓用終止退出。 最後,虛擬機將停止。
來源:Oracle Docu
當我讀到這,你將不得不中止你的線程並保存您的收藏(不Thread.abort
而是使用一些手段來結束他們優雅!)。至少你必須確保你正在保存收集的適當狀態。
如果線程不是「無限」而且沒有deamons,你可以讓它們完成。但我不會推薦這個,因爲關機掛鉤應該會很快返回。
從你的shutdownHook()
你可以優雅地通過發信號停止你的線程來終止你的線程。否則,如果你的線程是daemon threads
,那麼JVM不會等待它們完成。當您按ctrl + c時,它會在撥打shutdownHook()
後退出。請參閱此javadoc for daemon thread行爲。
我想當虛擬機啓動它的關閉序列。它將註冊所有關閉掛鉤。 – MMK