2014-03-27 68 views
0
class JoinDemo extends Thread { 
    JoinDemo(String nm) { 
     setName(nm); 
     start(); 
    } 
    public void run() { 
     for (int i = 1; i <= 5; i++) { 
      try { 
       Thread.sleep(100); 
      } catch (Exception e) { 
       System.out.println(e); 
      } 
      System.out.println(i); 
     } 
     System.out.println(getName() + " exiting."); 
    } 
    public static void main(String args[]) { 
     JoinDemo t1 = new JoinDemo("One"); 
     JoinDemo t2 = new JoinDemo("Two"); 
     JoinDemo t3 = new JoinDemo("Three"); 

     try { 
      t1.join(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     System.out.println("Main Thread Exits now."); 
    } 
} 

獲得的輸出是:Java中的join()方法如何工作?

1 
1 
1 
2 
2 
2 
3 
3 
3 
4 
4 
4 
5 
5 
Three exiting. 
One exiting. 
5 
Main Thread Exiting 
Two exiting. 

我寫上面的程序通過各種網站去後,瞭解加入的)概念(。但仍然無法獲得它。我面臨的問題是我使用了t1.join()。所以線程應該在三個線程之前退出,但是在這之前線程需要先退出三個線程。每次運行該程序時,輸出都是不同的。有時候,有兩次是在一次之前退出,或者是在三次之前退出。不應該在任何其他線程之前掛接一個退出?由於t1.join()等待線程之一終止之前三和一??

+3

尋求幫助時,做的第一件事就是確保你的代碼的格式和可讀性很強縮進。這次我已經爲你做了。 –

+0

當達到t1.join()時,顯然t1已經完成。要獲得該效果可能會更改爲Thread.sleep(2000)。 – PeterMmm

+1

幾乎完全相同的問題在這裏問:http:// stackoverflow。com/questions/18479771/java-multithreading-concept-and-join-method?rq = 1有一個很好的答案。 – danofa

回答

1

沒有你誤認爲join()的影響。

當你做一個t1.join()你只是斷言線程t1會在繼續程序之前完成。

正如你可以看到它的你有什麼,其主要由Main Thread Exiting象徵年底前

One exiting. 
5 
Main Thread Exiting 

一個出口。

如果你希望你的程序完成你應該做之前完成所有的線程:

try { 
     t1.join(); 
     t2.join(); 
     t3.join(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

如果你想一完成,然後2然後3

JoinDemo t1 = new JoinDemo("One"); 
    try { 
     t1.join(); 
    } catch (Exception e) { System.out.println(e); } 

    JoinDemo t2 = new JoinDemo("Two"); 
    try { 
     t2.join(); 
    } catch (Exception e) { System.out.println(e); } 

    JoinDemo t3 = new JoinDemo("Three"); 
    try { 
     t3.join(); 
    } catch (Exception e) { System.out.println(e); } 
+1

您的最後一個示例將有效地序列化這些線程的執行。相反,你可能想要添加一個線程2加入線程1和線程3加入2的例子,但所有3都開始(幾乎)同時。 – Thomas

+0

好吧,它就像我沒有控制線程完成,但控制主線程執行。像我可以控制當我的主線程完成使用join()? –

0

確切地知道加入( )在做什麼,

JoinDemo t1=new JoinDemo("One"); 
t1.join(); 
JoinDemo t2=new JoinDemo("Two"); 
JoinDemo t3=new JoinDemo("Three"); 

只需在聲明t1之後調用方法並參閱。

join()方法會使已經初始化的Thread先完成。所以其他的Threads都會等到那時。

0

t1.join()只是確保您的主線程將阻止,直到t1已完成。與其他兩個線程相比,您無法控制t1的完成速度。

t1t2t3受線程調度程序的支配。代碼中唯一的保證是t1將在主線程之前完成。

0

您正在運行3個不同的線程。每個線程使用的CPU的優先級或數量取決於java實現,在某些情況下,它由OS完成。這就是爲什麼你得到不同的輸出。 連接使運行中的線程等待,直到連接線程死亡。

我想你想要這樣的輸出:

class JoinDemo extends Thread { 
    JoinDemo(String nm) { 
     setName(nm); 
    } 
    public void run() { 
     for (int i = 1; i <= 5; i++) { 
      try { 
       Thread.sleep(100); 
      } catch (Exception e) { 
       System.out.println(e); 
      } 
      System.out.println(i); 
     } 
     System.out.println(getName() + " exiting."); 
    } 
    public static void main(String args[]) { 
     JoinDemo t1 = new JoinDemo("One"); 
     JoinDemo t2 = new JoinDemo("Two"); 
     JoinDemo t3 = new JoinDemo("Three"); 
     try {    
      t1.start(); 
      t1.join(); 
      t2.start(); 
      t2.join(); 
      t3.start(); 
      t3.join(); 

     } catch (Exception e) { 
      System.out.println(e); 
     } 
     System.out.println("Main Thread Exits now."); 
    } 
}