2011-01-22 51 views
2

我正在編寫一個Java客戶端,它理論上可以在不同的環境中使用:Java main(),在servlet容器中或通過依賴注入。如何實現將在執行結束時自動關閉的線程池?

客戶端實現內部連接線程池。

這種方法的問題是,不知道內部線程池實現這一事實的客戶端用戶會在關機時看到他或她的應用程序「掛起」。我的用戶需要知道發送shutdown()消息給庫。

我想知道是否可以採取任何其他替代方法,一方面允許我爲我的連接啓動線程池;另一方面,捕獲一些事件,可能是JVM事件,表明JVM正在關閉,這將允許我調用shutdown()實現。

+0

可能的重複[我在哪裏開始調查我的Java過程不會結束?](http://stackoverflow.com/questions/3236427/where-do-i-start-investigating-my-java-process - 即,不會端) – finnw 2011-01-23 17:24:30

回答

5

雖然您可以像以前所建議的那樣添加掛鉤,但您仍然可能遇到的問題是仍然具有活動線程的線程池。

我相信,如果您將您的各個線程標記爲「守護進程」(通過Thread.setDaemon方法),那麼如果只剩下守護進程線程,JVM將不會保持活動狀態。

從JavaDoc的:

將該線程標記爲守護線程或用戶線程。當只有運行的線程都是守護進程線程時,Java虛擬機纔會退出。

如果您的主要非守護線程終止,JVM將不會因爲其他線程正在運行而「掛斷」,並且這會觸發您的關閉掛鉤,而不必顯式發送終止指令到各種線程。

0

如果問題是您的代碼的用戶不知道有一個線程池被關閉,也許解決方案是讓他們知道它?在相關類的工廠方法或構造函數中,請將ExecutorService用作參數,以便調用者負責其生命週期。也就是說,使用依賴注入來推動政策向上。