2017-09-03 97 views
-3

下面給出的代碼演示了Java多線程中isAlive()的使用... 我無法解釋輸出序列的顯示效果。我期望的輸出是r1 r1 true true r2 r2
任何人都可以幫我解決這個問題。isAlive()在java多線程中執行

public class MyThread extends Thread 
{ 
    public void run() 
    { 
     System.out.println("r1 "); 
     try { 
       Thread.sleep(200); 
     } 
     catch(InterruptedException ie) { } 
     System.out.println("r2 "); 
    } 
    public static void main(String[] args) 
    { 
     MyThread t1=new MyThread(); 
     MyThread t2=new MyThread(); 
     t1.start(); 
     t2.start(); 
     System.out.println(t1.isAlive()); 
     System.out.println(t2.isAlive()); 
    } 
} 

輸出: R1 真正 真正 R1 R2 R2

+4

不,它不應該。你開始2線程和你的輸出完全取決於調度和其他事情。如果你正在尋找一個特定的輸出,這段代碼不會給它。它可以在你運行它的時間之間改變。 – Kayaman

+0

爲什麼你認爲輸出應該是你期望的? –

+0

你沒有真正解釋爲什麼你認爲輸出應該是你認爲應該是的。您最好審閱Oracle提供的併發教程文檔,然後在問題仍不清楚的情況下完善您的問題。 https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html – pvg

回答

-2

輸出

r1 
true 
true 
r1 
r2 
r2 

是完全合理的,如果兩個線程正在運行,但他們中的一個(可能但不當然第二個)已經開始運行,但還沒有達到System.out.println("r1")

沒有進一步的同步結構,這是「競爭條件」的直接示例。

爭用條件或種族的危害是電子的, 軟件或其他系統,其中所述輸出依賴於不可控制的其他事件的 序列或定時的行爲。

https://en.wikipedia.org/wiki/Race_condition

NB:PrintStream(即System.out是一個實例)不能保證線程安全所以就像失去了一些打印結果至少在理論上是可能的。

+0

System.out似乎是線程安全的,我沒有得到最後一段的要點。 –

+0

@NathanHughes它看起來確實如此。但我找不到任何保證。 – Persixty

+0

是的,這只是錯誤的信息,'println()'和它的變體是線程安全的,你永遠不會得到不同調用的混合輸出。 (x){ synchronized(this){ print(x); newLine(); } }' –