所以我有這段Java代碼,我需要在一堆項目上做一些工作。我決定將其並行化以獲得一些額外的提升,但我仍然使用ThreadPoolExecutor。問題是,我需要做的工作可以拋出異常...在ThreadPool中報告異常並關閉
現在我想關閉整個工作,一遇到錯誤就停下來,並報告回來,以便我可以處理它。在網上查看時,我發現通過ExecutorCompletionService和分析未來結果的正常方式。但是,當第一個錯誤出現時,這不會讓我關閉所有的東西,因爲沒有辦法根據哪個任務先完成循環...
所以我做了一些我認爲是相當黑客和我很好奇,如果有更好的方法來處理這個問題。我所做的是:
1)讓每個我將執行的Runnable都有一個可執行Throwable的字段。 2)覆蓋TPE的「afterExecute」方法,並檢查是否有任何檢查的異常被拋出(記錄在Runnable中)或任何未被檢查的異常被拋出(應該在此方法的第二個參數中報告)。如果有的話,我在TPE上發出shutdownNow()。
同樣,這似乎有點hacky,我想知道是否有什麼我失蹤。提前致謝!
是否需要停止其他任務執行剛性測試,在第一次失敗後甚至執行單個測試是災難性的?或者它是一個「有益」的要求,因爲如果其他任務保持運行一段時間就可以了,但是越快它們停下來越好?我問,因爲即使說「第一次失敗來臨」在並行執行環境中也不清楚,因爲沒有仔細的同步,你不知道在不同線程上執行任務的順序。 –
你明白了「很高興」的要求,因爲我只想通知所有並行任務,當他們中的一個遇到錯誤時應立即停止。當然,由於線程在池中運行的方式,這可能並不意味着「儘快」,但這是一個原則性的事情。 實際上,您可以將其視爲具有啓動我的ThreadPool的阻止調用,並且我希望這可以報告結果,如果一切正常,或儘快解除阻止以最大限度地提高可用性。 –