2014-04-19 59 views
1

我正在編寫一個相當大的多線程應用程序,它爲線程提供了許多不同的角色(例如事件處理,指標,網絡)。目前,如果有任何不能處理的不一致,它將表現爲例外。由於沒有辦法從其中一些中恢復,因此我將它重新拋出爲ApplicationDeathException類型的運行時異常。使用Thread.stop(Throwable)強制將一個運行時異常強制拋入線程是否存在危險?

任何需要處理關閉的類都會從這個異常的catch塊中調用它,然後重新拋出它以便它傳播堆棧)。

我正在考慮通過調用Thread#stop(Throwable)來關閉其他所有線程。大多數都可以突然終止,如果需要關閉邏輯,可以捕獲此異常。他們只會將異常傳播到堆棧中,隨時執行關閉邏輯,最終只會終止線程。這種方法有沒有隱藏的隱患?

回答

2

Thread.stop已被棄用,因爲它是不安全的(請參閱Javadoc)。相反,每個線程監視某種布爾標誌(請參閱Java: How to stop thread?以及SO上的無數其他線程)。

在這種情況下,我通常實現某種線程池管理器,負責乾淨地關閉正在運行的線程。那麼當發生非常糟糕的事情時,您只需通知經理關閉一切。

+0

我明白你提到的是一種有效的方法。我目前的問題有點不同,即在我的方法會遇到的僵局或其他陷阱方面是否存在任何危險。 – hexafraction

+0

你的方法是否會死鎖真的取決於你的線程在做什麼,你的實現,什麼資源被保存等等。我認爲你的方法看起來很合理(除了使用Thread.stop),但是這並不意味着你的方法不存在,有可能造成僵局。 –

+0

所有資源都在關閉時釋放,不需要明確獲取任何新的東西。 – hexafraction