0

這裏是我的情況:我如何中斷一個長時間運行的Java線程中的ThreadPoolExecutor

我對他們Thread的I進行HTTP調用通過SSL服務器的ThreadPoolExecutor。有時,我得到一個NullPointerException,因爲客戶端無法解密服務器響應,並且線程只是無限期地掛在池中導致活鎖。有沒有人知道一個好的方法來定位池中的特定線程,檢查它運行的時間以及如果運行時間超過3分鐘就會中止/終止它?

歡迎任何建議。

+3

我的建議是修復NullPointerException。這種例外是一個錯誤的明顯標誌。它不應該發生。即使發生了,它也應該放棄任務。與往常一樣,要獲得更多幫助,請發佈代碼和異常的堆棧跟蹤。 –

+0

來自此庫的異​​常https://java.net/projects/http-client是的我知道它是/可能是一個錯誤,但是我最終會將我的項目遷移到Java 9,並且它有一個HTTP客戶端(大概是相同的),我想處理報告錯誤。現在我必須在一個緊要關頭完成任務。此外,無論如何,我想控制我的線程,以防萬一。 – impeto

+0

我可能會遺漏一些東西,但是如果您從該庫中獲得了NPE,則控件已經返回到您的代碼中,爲什麼不能只進行清理(如果有)並退出運行塊? – zeppelin

回答

0

如果你保留對該線程的引用,那麼你可以調用interrupt()方法來中斷它。例如:

Thread t = new Theard(r); 
t.interrupt(); 

(r是可運行的,工作)

Spring AOP實現,你可以指望就是這樣開始的方法被觸發的瞬間經過的時間。

另一種解決方案是使用自己的線程工廠,在工廠確保在3分鐘後中斷每個線程。

另一種方法是使用:的ScheduledThreadPoolExecutor

設置你的任務是一段時間,運行,讓它結束後襬好一個執行

+0

我已經擴展了ThreadPoolExecutor並覆蓋了before/afterExecute方法,但它感覺不舒服和耦合。我希望有人會有一個更優雅的解決方案 – impeto

+0

與線程工廠,你可以添加一個3分鐘的定時器,然後中斷線程。 –

+0

是的,但是在'ThreadFactory'中,我只能設置'Thread'創建的時間。我需要設定每個任務開始的時間。 – impeto

相關問題