這裏是我的情況:我如何中斷一個長時間運行的Java線程中的ThreadPoolExecutor
我對他們Thread
的I進行HTTP調用通過SSL服務器的ThreadPoolExecutor
。有時,我得到一個NullPointerException
,因爲客戶端無法解密服務器響應,並且線程只是無限期地掛在池中導致活鎖。有沒有人知道一個好的方法來定位池中的特定線程,檢查它運行的時間以及如果運行時間超過3分鐘就會中止/終止它?
歡迎任何建議。
這裏是我的情況:我如何中斷一個長時間運行的Java線程中的ThreadPoolExecutor
我對他們Thread
的I進行HTTP調用通過SSL服務器的ThreadPoolExecutor
。有時,我得到一個NullPointerException
,因爲客戶端無法解密服務器響應,並且線程只是無限期地掛在池中導致活鎖。有沒有人知道一個好的方法來定位池中的特定線程,檢查它運行的時間以及如果運行時間超過3分鐘就會中止/終止它?
歡迎任何建議。
如果你保留對該線程的引用,那麼你可以調用interrupt()方法來中斷它。例如:
Thread t = new Theard(r);
t.interrupt();
(r是可運行的,工作)
Spring AOP實現,你可以指望就是這樣開始的方法被觸發的瞬間經過的時間。
另一種解決方案是使用自己的線程工廠,在工廠確保在3分鐘後中斷每個線程。
另一種方法是使用:的ScheduledThreadPoolExecutor
設置你的任務是一段時間,運行,讓它結束後襬好一個執行。
我的建議是修復NullPointerException。這種例外是一個錯誤的明顯標誌。它不應該發生。即使發生了,它也應該放棄任務。與往常一樣,要獲得更多幫助,請發佈代碼和異常的堆棧跟蹤。 –
來自此庫的異常https://java.net/projects/http-client是的我知道它是/可能是一個錯誤,但是我最終會將我的項目遷移到Java 9,並且它有一個HTTP客戶端(大概是相同的),我想處理報告錯誤。現在我必須在一個緊要關頭完成任務。此外,無論如何,我想控制我的線程,以防萬一。 – impeto
我可能會遺漏一些東西,但是如果您從該庫中獲得了NPE,則控件已經返回到您的代碼中,爲什麼不能只進行清理(如果有)並退出運行塊? – zeppelin