我有,應該是長時間運行的服務器,並且滋生了IO幾個後臺線程。我試圖確保後臺/ IO線程不會停止,或者如果它們停止運行,它們將被恢復。
目前的解決方案
目前我主循環只檢查所有的背景調查(以下僞代碼)的狀態。我認爲應該有更好的辦法。
while (!Thread.currentThread().isInterrupted()) {
maintainThreads();
doWork();
condition.await(30, TimeUnit.SECONDS);
}
我嘗試
我考慮切換到SingleThreadExecutor
,具有自定義queue
時,它拉的下一個任務將不會刪除Runnable
。 executor
然後會管理我的線程,所以我可以把它從我的主循環。
我擔心每個線程有一個執行程序會帶來性能問題,並且存在針對此問題的更簡單/更好的解決方案。我也考慮過爲每個線程設置關閉鉤子,讓它們自己重新啓動。
任何幫助,將不勝感激。
「go down」是什麼意思?你的意思是說,一些包含代碼引發異常?你可以在try/catch中包裝你的'run()'方法的主體,這樣可以防止線程終止異常 - 但是你必須考慮很長時間並且很難了解你的'doWork()'和其他方法來拋出異常。是否有可能繼續? – BeeOnRope
[UncaughtExceptionHandler](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true)? – GPI
@BeeOnRope我維護的線程大多隻是IO連接('doWork()'的生成器),它已經捕獲了所有檢查的異常。如果線程要終止,那麼主循環只是在旋轉,所要做的就是記錄問題並嘗試重新創建它們直到它們連接。我想我的主要問題是「假設我想要一個線程運行,只要我的程序正在運行,無論是什麼導致它停止運行,乾淨的方法是什麼」。 – billie