2014-12-22 71 views
0

考慮下面的代碼:異常在Java線程

public class ThreadT implements Runnable { 

public void run() { 
System.out.println("run."); 
throw new RuntimeException("Problem"); 
} 
public static void main(String[] args) { 
Thread t = new Thread(new ThreadT()); 
t.start(); 
System.out.println("End of method."); 
} 
} 

我得到的輸出是:

End of method. 
run. 
Exception in thread "Thread-0" java.lang.RuntimeException: Problem 

爲什麼輸出是不喜歡這樣的:

run. 
Exception in thread "Thread-0" java.lang.RuntimeException: Problem 
End of method. 
+0

[高度相關](http://stackoverflow.com/questions/20563287/why-arent-the-calls-in-main-sequential)。 – ChiefTwoPencils

+0

如果你不想讓它獨立運行,你爲什麼要使用一個線程? –

回答

1

避免這一點,我相信這是因爲當你運行主旁邊一個新的線程,兩個線程同時運行,首先它打印出「法的終結」,它運行後的第二權。outprint(這可能是幾毫秒背後

試試這個:

public class thread implements Runnable { 

public void run() { 
System.out.println("run."); 
throw new RuntimeException("Problem"); 
} 
public static void main(String[] args) throws InterruptedException { 
Thread t = new Thread(new thread()); 
t.start(); 
Thread.sleep(3000); 
System.out.println("End of method."); 
} 
} 

我在這裏所做就是把主線程進入睡眠3秒,給時間線T上先運行

或者您也可以寫join()先等待線程完成。像這樣:

public class thread implements Runnable { 

public void run() { 
System.out.println("run."); 
throw new RuntimeException("Problem"); 
} 
public static void main(String[] args) throws InterruptedException { 
Thread t = new Thread(new thread()); 
t.start(); 
t.join(); 
System.out.println("End of method."); 
} 
} 
+0

嘗試使用join()函數 - 我用代碼更新了我的答案。 – MoOoG

+1

join()版本比sleep()版本更聰明。調用sleep()的合法理由很少。特別是,沒有可以通過添加sleep()調用來修復的同步錯誤。如果你認爲你通過調用sleep()來修復了一個bug,那麼你實際上做的是讓這個bug在測試過程中發生的可能性要小得多(可能大得多,不太可能)。但是這個錯誤仍然存​​在,並且如果它曾經被咬過,它可能會在現場和客戶現場出現,很久以後,每個人都忘記了它的存在,而且很難找到/解釋。 –

2

當您啓動一個新的線程(沒有添加任何同步),你無法控制哪個語句將被首先執行 - 主線程或代碼的下一個語句第二個線程中的run方法。

沒有理由期望新線程的run方法將在主線程主方法的下一個語句之前執行。

2

當您啓動一個線程時,需要時間。您也正在啓動一個線程,其唯一目的是獨立於主線程執行。這可能意味着它在主線程完成後運行。


此外,錯誤可能出現在消息之前。

您正在寫入不同的流,一個是System.out,另一個是System.err,並且這些出現在屏幕上的順序未確定。你可以用

new RuntimeException("Problem").printStackTrace(System.out); 
相關問題