2013-12-11 59 views
2

我有以下代碼試圖undersatand join()方法

class Multi extends Thread{ 

public void run(){ 
    for(int i=1;i<=3;i++){ 

    System.out.println(i + ": "+Thread.currentThread().getName()); 
    } 
} 
public static void main(String args[]){ 
Multi t1=new Multi(); 
t1.setName("First Thread"); 
Multi t2=new Multi(); 
t2.setName("Second Thread"); 
Multi t3=new Multi(); 
t3.setName("Third Thread"); 
t1.start(); 
t2.start(); 
try{ 
    t1.join(); 
    t2.join(); 
}catch(Exception e){System.out.println(e);} 

t3.start(); 
} 
} 

**

的輸出有所不同每次運行時間:

1st time Output 

1: Second Thread 
2: Second Thread 
3: Second Thread 
1: First Thread 
2: First Thread 
3: First Thread 
1: Third Thread 
2: Third Thread 
3: Third Thread 


============================================= 
2nd time Output 

1: First Thread 
2: First Thread 
3: First Thread 
1: Second Thread 
2: Second Thread 
3: Second Thread 
1: Third Thread 
2: Third Thread 
3: Third Thread 


************************************************* 

由於t2.join()t1.join()如何後調用第一個輸出來了嗎? t2是否應該等待t1執行?

請幫助我瞭解join()法的行爲,如果可能的話有更多的代碼片段的例子

+0

爲了得到你期望的行爲,你需要在*'t1.join()之後調用't2.start()'*。在你當前的代碼中,兩個線程並行運行。 – assylias

+0

感謝您的編輯:)我正要這樣做 –

回答

7

t.join()當前線程(在你的榜樣主線程),直到線程t完成執行。它不會阻塞任何其他線程,也不會阻止任何其他線程運行。

你的例子開始t1和t2。所以t1和t2並行運行。主線程阻塞,直到t1完成。一旦t1完成,它將阻塞,直到t2完成。 t2很可能在t1之前完成執行。在這種情況下,t2.join()將立即返回。

2

join method不影響當前正在執行的任何Thread的執行順序。所有這一切都會使當前線程等到指定的Thread結束。

2

線程t2等待t1玩完..你需要寫t1.join()run()方法t2

在你的情況下,主線程將等待t1和t2完成,然後它將啓動線程t3。從輸出中可以明顯看出t3在t1和t2完成後已經開始。

1

輸出會有所不同,因爲它可以預測t1t2線程將在幕後工作。這就是默認情況下線程在JVM上的工作方式。它與你的join()方法無關。在你的情況下,當你調用t1.join()時,它只意味着「主」線程將等待t1線程完成其工作。同樣是關於t2.join()