我正在使用一個線程來運行應用程序的一半,另一半正在運行。我這樣做是爲了讓一部分獲取數據(因爲我正在運行一個無限循環)不會阻止另一部分完成它的工作。現在我想知道:如果一個部分發生異常,它會阻塞另一部分,因爲它們彼此依賴。如何防止異常停止我的程序?
所以我的問題是,我怎麼能阻止異常停止我的整個程序,並使其繼續做事?
我正在使用一個線程來運行應用程序的一半,另一半正在運行。我這樣做是爲了讓一部分獲取數據(因爲我正在運行一個無限循環)不會阻止另一部分完成它的工作。現在我想知道:如果一個部分發生異常,它會阻塞另一部分,因爲它們彼此依賴。如何防止異常停止我的程序?
所以我的問題是,我怎麼能阻止異常停止我的整個程序,並使其繼續做事?
試抓或拋出異常。如果這些聽起來都不熟悉,我會查找它們。
的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
這並不足以直接解決原始問題。如果由於未捕獲的異常導致另一個線程崩潰,原始問題將詢問一個線程的穩定性。 – nasukkin
從一個線程拋出異常通常不會影響他人的運行時間。在這方面,線程對於他們自己的小世界來說很有意思。如果兩個線程共享一些狀態(不管是直接通過堆還是間接通過數據庫或類似的東西),並且一個線程將應用程序的數據置於不穩定/損壞的狀態,因爲它被轟出,明顯影響其他線程的行爲,使他們進一步「壞東西」。你會盡可能地防止這種情況;最好的辦法是儘可能記錄異常,並在拋出時捕捉並處理它們,並用強大的單元測試來支持您的邏輯。
您可以創建一個布爾變量,可能被稱爲running
,這樣雖然您的while循環工作正常,但此變量將爲true。立即發現異常,變量變爲false。然後,您的主要任務可以隨時檢查變量是否希望使用共享數據。如果變量爲真,則讀取數據;否則,請根據捕獲到的異常類型來執行其他操作,例如重新啓動線程。
請記住,爲了使變量爲false,您需要將其更新包含在catch子句中。
有更好和更復雜的方法,如使用ExecutorService
。
這只是不正確的方式來使用多線程。您必須創建某種同步方法,以便如果有差異,則必須等待另一個(此「一」和「另一個」取決於您的代碼的設計方式)。 有沒有乾淨的方式來處理這種異常。在這種情況下,Try/Catch不會很好地工作。 –