我有一個ExecutorService
坐在一個singleton類中,它接收來自許多不同類的任務。在應用程序關閉時,我需要等待池被清空,然後才允許應用程序退出。阻止Java應用程序退出,直到ThreadPool爲空
private static NotificationService instance = null;
private ExecutorService executorService = Executors.newFixedThreadPool(25);
public static synchronized NotificationService getInstance() {
if (instance == null) {
instance = new NotificationService(true);
}
return instance;
}
在使用本NotificationService
,它經常發生,我重新啓動應用程序和executorService
還沒有處理完所有的通知。
對於測試,我可以手動關閉executorService並等待所有任務完成。
public static boolean canExit() throws InterruptedException {
NotificationService service = getInstance();
service.executorService.shutdown();
service.executorService.awaitTermination(30, TimeUnit.SECONDS);
return service.executorService.isTerminated();
}
覆蓋finalize
方法並等待直到池爲空是否可靠和安全?從我讀過的內容來看,並不總是調用finalize,尤其是在使用單例類時。
@Override
protected void finalize() throws Throwable {
while (!canExit()){
Thread.sleep(100);
}
super.finalize();
}
此代碼包含在將包含在另一個應用程序庫,所以沒有主要的方法,我可以等到池是空的,除非我用它這樣做是不強迫人大。
什麼是正確的方式來拖延應用程序(一段合理的時間)從終止,直到池是空的?
你的實現有什麼問題? canExit()會阻止,直到執行器完成或30秒。把它放在一個循環中,直到它返回true,你應該沒問題。 – Fildor
其他問題:實際處理所有通知至關重要嗎?或者你能否比你能夠更快地「取消」它們? - 當然,給定一個關機場景。 – Fildor
@Fidor,當我控制一切時,canExit可以工作,如前所述,這將用於庫中,因此技術上我可以從shutdownhook調用canExit。在關機時,我至少有機會備份尚未發送的通知,所以即使很可能只有一個或兩個未處理的項目在池中,我也不會丟失它們過程,那就是我以前的做法,當有人關閉Tomcat時處理最後一個或兩個通知。 –