需求:有一個list集合,有三個檢查方法checkA(list), checkB(list), checkC(list),三個方法從不同角度去檢測list中的數據是否合法,當全部檢查都通過時,再進行后續的操作。解決方案:我現在想用ExecutorService創建三個線程分別調用三個檢查方法,提高效率。任何一個方法中發現無效數據直接拋一個異常結束該線程。問題:在主線程調用三個線程后,如何在主線程中catch住其中一個線程的異常,并將其他兩個線程立即停止?看了一下executorservice的shutdown()方法和shutdownnow(),我理解的是,這兩個方法都不能保證立即停止線程,不知道我的理解對嗎?
1 回答
已采納

是王小二呀
TA貢獻88條經驗 獲得超19個贊
這么說吧,CPU單核心時,設計一個全局變量作為狀態值,比如期望值為0,三個線程分別遍歷檢查list,每次遍歷都去讀這個狀態值,只要三個線程有那一個在遍歷過程中出錯,即改變此狀態值,此時其他兩個線程便能監控到狀態變量的改變,此時跳出遍歷,結束線程即可。CPU多核心時,三個線程有可能分給三個核心去執行,此時涉及到競寫,可以對狀態值加鎖,也可在主線程再維護一個volatile變量,然后在主線程中為三個線程各自維護一個狀態變量,check方法遍歷時去檢測volatile變量,當主線程監測到三個線程其中一個check出錯改變自己的狀態變量值時,主線程即改變此volatile變量,這時候呢由于這個變量的特性,其他兩個線程會立即得到volatile變量值的變化,由此跳出遍歷并結束線程。
添加回答
舉報
0/150
提交
取消