2016-07-28 104 views
0

我正在使用一個線程來運行應用程序的一半,另一半正在運行。我這樣做是爲了讓一部分獲取數據(因爲我正在運行一個無限循環)不會阻止另一部分完成它的工作。現在我想知道:如果一個部分發生異常,它會阻塞另一部分,因爲它們彼此依賴。如何防止異常停止我的程序?

所以我的問題是,我怎麼能阻止異常停止我的整個程序,並使其繼續做事?

+0

這只是不正確的方式來使用多線程。您必須創建某種同步方法,以便如果有差異,則必須等待另一個(此「一」和「另一個」取決於您的代碼的設計方式)。 有沒有乾淨的方式來處理這種異常。在這種情況下,Try/Catch不會很好地工作。 –

回答

0

試抓或拋出異常。如果這些聽起來都不熟悉,我會查找它們。

的try-catch的一個例子拋出異常

try 
{ 
//your code that may throw exception 
}catch(TheException e){ 
e.printStackTrace(); // or however you handle exceptions 
} 

很好的資源:https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html

+0

這並不足以直接解決原始問題。如果由於未捕獲的異常導致另一個線程崩潰,原始問題將詢問一個線程的穩定性。 – nasukkin

0

從一個線程拋出異常通常不會影響他人的運行時間。在這方面,線程對於他們自己的小世界來說很有意思。如果兩個線程共享一些狀態(不管是直接通過堆還是間接通過數據庫或類似的東西),並且一個線程將應用程序的數據置於不穩定/損壞的狀態,因爲它被轟出,明顯影響其他線程的行爲,使他們進一步「壞東西」。你會盡可能地防止這種情況;最好的辦法是儘可能記錄異常,並在拋出時捕捉並處理它們,並用強大的單元測試來支持您的邏輯。

0

您可以創建一個布爾變量,可能被稱爲running,這樣雖然您的while循環工作正常,但此變量將爲true。立即發現異常,變量變爲false。然後,您的主要任務可以隨時檢查變量是否希望使用共享數據。如果變量爲真,則讀取數據;否則,請根據捕獲到的異常類型來執行其他操作,例如重新啓動線程。

請記住,爲了使變量爲false,您需要將其更新包含在catch子句中。

有更好和更復雜的方法,如使用ExecutorService