2013-01-31 34 views
0

我有一個關於Runtime.getRuntime().addShutdownHook()的問題。當ShutdownHook被調用?

假設我有兩個以main開頭的線程。兩個線程都在處理一個集合,即List<String> commonColection

當我按Ctrl+C我想保存這個集合。我的問題是:線程在ShutdownHooks被調用之前停止,還是需要顯式終止我的線程,然後保存我的集合?

+0

我想當虛擬機啓動它的關閉序列。它將註冊所有關閉掛鉤。 – MMK

回答

1

當虛擬機開始關閉序列,它會以某種未指定的順序啓動 所有已註冊的關閉掛鉤,並讓它們同時運行 。當所有掛鉤完成後,它將運行 所有未引用的終結器,如果已啓用終止退出。 最後,虛擬機將停止。

來源:Oracle Docu

當我讀到這,你將不得不中止你的線程並保存您的收藏(Thread.abort而是使用一些手段來結束他們優雅!)。至少你必須確保你正在保存收集的適當狀態。

如果線程不是「無限」而且沒有deamons,你可以讓它們完成。但我不會推薦這個,因爲關機掛鉤應該會很快返回。

0

從你的shutdownHook()你可以優雅地通過發信號停止你的線程來終止你的線程。否則,如果你的線程是daemon threads,那麼JVM不會等待它們完成。當您按ctrl + c時,它會在撥打shutdownHook()後退出。請參閱此javadoc for daemon thread行爲。

相關問題