2011-05-03 81 views
14

Java線程的join()方法讓我困惑了一下。我有下面的例子瞭解join()方法示例

class MyThread extends Thread { 
    private String name; 
    private int sleepTime; 
    private Thread waitsFor; 

    MyThread(String name, int stime, Thread wa) { … } 

    public void run() { 
     System.out.print("["+name+" "); 

     try { Thread.sleep(sleepTime); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"? "); 

     if (!(waitsFor == null)) 
     try { waitsFor.join(); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"] "); 

而且

public class JoinTest2 { 
    public static void main (String [] args) { 
     Thread t1 = new MyThread("1",1000,null); 
     Thread t2 = new MyThread("2",4000,t1); 
     Thread t3 = new MyThread("3",600,t2); 
     Thread t4 = new MyThread("4",500,t3); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
    } 
} 

在其順序線程終止?

+4

這是一個詭計問題嗎?或作業? :) – bzlm 2011-05-03 16:45:36

+0

剛剛讀了一些電子書,發現這個例子,實際上執行線程等待線程在哪裏加入被稱爲完成,也許我今天就退出:D – 2011-05-03 16:50:27

+0

等待線程死亡。 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#join() – 2011-05-03 16:51:05

回答

12

究竟是什麼使您對Thread.join()感到困惑?你沒有提到任何具體的東西。

鑑於Thread.join()(如the documentation states),Waits for this thread to die,然後t4將等待t3來完成,這將等待t2來完成,這將等待t1完成。

因此t1將首先完成,然後是t2,t3t4

6

它將以t1,t2,t3,t4 ...的順序結束... join使當前正在執行的線程等待,直到它所調用的線程終止。

2

有一個主線程啓動您創建的四個海關線程t1,t2,t3和t4。現在,如果在線程上調用join()方法並且沒有提供參數(time)(默認情況下它爲0,意味着最大等待時間是永久的),那麼調用線程將等待調用連接的線程終止。

當調用t1.start()時,它的相應的run()方法被JVM調用。因爲t1的waitsFor參數爲null,它只會通過打印它的名字來終止。由於您正在添加睡眠t2,t3,t4會在t1完成睡眠時開始。現在t2將等待t​​1終止,因爲我們正在從t2調用t1上的join。同樣,t3將等待t2,t4將等待t3。所以你執行會去t1->t2->t3->t4

但是,如果t1在t2調用加入之前終止,則加入將簡單地返回,因爲此時(t2調用t1時加入)isAlive()將爲false