2009-12-07 53 views
2

我目前正在開發一個守護進程,它將執行很多不同的任務。它是多線程的,它可以處理幾乎任何類型的內部錯誤而不會崩潰。那麼我正在處理關閉請求的問題,我不知道該如何去做。Java守護進程 - 處理關閉請求

我有一個關閉鉤子設置,當它被調用時,它設置一個變量,告訴主守護進程循環停止運行。問題是,這個守護進程產生多個線程,並且可能需要很長時間。例如,其中一個線程可能會轉換文檔。他們中的大多數會很快(我猜在10秒以內),但是會有線程持續10分鐘以上。

我現在想做的事情是,當一個關閉鉤子已經發送,在ThreadGroup.activeCount()上做一個循環,時間爲500ms(左右)Sleep(所有這些線程都在ThreadGroup),在這個循環之前,我會發送一個通知給所有線程,告訴他們一個關閉請求已經被調用。然後,無論他們在做什麼清理和關機,他們都必須立即進行。

其他人有什麼建議嗎?我感興趣的是像MySQL這樣的守護進程,當它被告知停止時,會立即停止。如果像10個查詢運行速度非常慢,會發生什麼情況會被調用?它是否等待或只是結束它們。我的意思是服務器真的很快,所以實際上沒有任何一種操作,我不應該在一秒鐘內完成。現在你可以在1000毫秒內完成一次。

感謝

回答

2

java.util.concurrent package提供了許多實用工具,如ThreadPoolExecutor(以及來自Executors類各專業類型的其他Executor實現)和ThreadPoolExecutor.awaitTermination(),你可能要考慮 - 因爲他們提供的您希望實現的功能也完全相同。通過這種方式,您可以專注於實現應用程序/任務的實際功能,而不用擔心線程和任務調度等問題。

+0

我原來使用ThreadPoolExecutor並最終將其更改爲其他內容。處理線程等工作正常。我已經設置關閉線程,我的問題是我不喜歡關閉INSTANTLY並告訴我的線程停止的想法。問題是,如果一個程序需要關閉,沒有辦法繞過它。我想我正在尋找魔法。我會將其設置爲已接受,因爲我的問題不是很具描述性。謝謝! – William 2009-12-07 23:55:21

+0

當你收到關機信號時,用超時的方式調用'awaitTermination()',如果超時,然後殺死線程('shutdown()'),那麼怎麼辦?您是否需要在特定時間段內處理關機? – 2009-12-07 23:59:28

+0

不,我只是希望它很快,因爲如果服務器正在關閉,或者發生什麼事情,延遲並不是那麼好。我想我會打電話給所有線程,告訴他們是時候關機了,他們都有3秒的時間完成,如果他們不這樣做,我會殺了他們,然後退出。我想我正在尋找一種神奇的「讓時間停頓,讓我線程完成,然後回到現實世界」一秒鐘。 :)謝謝你們的幫助! – William 2009-12-08 00:14:09

1

您的主題作業是否可以通過Thread#interrupt()進行中斷?他們是否主要通過投放InterruptedException的功能?如果是這樣,那麼前面提到的java.util.concurrent.ExecutorService#shutdownNow()就是要走的路。它會中斷任何正在運行的線程並返回從未啓動的作業列表。

同樣,如果你掛在由ExecutorService#submit()產生的Future S,你可以使用Future#cancel(boolean)並通過true請求一個正在運行的作業中斷。

除非你在代碼中調用你的控制燕子中斷信號(比如,通過捕捉InterruptedException沒有調用Thread.currentThread().interrupt())的,使用內置的合作中斷設施是不是引入自己的標誌近似什麼是更好的選擇已經在那了。