2015-06-04 74 views
2

我看了一些教程,甚至已經問過問題here不同的輸出加入方法

但我再次與join方法混淆。 我所知道的Java不能保證線程的執行正常情況下的順序。

我使用join()方法讀取,它確保一旦一個線程調用加盟,當前線程將不執行,除非你已經調用線程加入完畢。

我的例子我想

public class ThreadTest1 extends Thread{ 

    @Override 
    public void run() { 
     super.run(); 
     for(int i=0; i<10; i++) 
     { 
      System.out.println(i + " :"+ Thread.currentThread().getName()); 
     } 
    } 

    public static void main(String[] args) { 

     System.out.println("Thread is getting started"); 
     ThreadTest1 th0= new ThreadTest1(); 
     th0.start(); 
     ThreadTest1 th1= new ThreadTest1(); 
     th1.start(); 
     try { 
      th1.join(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

輸出:

First time output 
0 :Thread-1 
1 :Thread-1 
2 :Thread-1 
0 :Thread-0 
3 :Thread-1 
1 :Thread-0 
4 :Thread-1 
2 :Thread-0 
5 :Thread-1 
3 :Thread-0 
6 :Thread-1 
4 :Thread-0 
7 :Thread-1 
8 :Thread-1 
9 :Thread-1 
5 :Thread-0 
6 :Thread-0 
7 :Thread-0 
8 :Thread-0 
9 :Thread-0 
Second time output: 
0 :Thread-1 
0 :Thread-0 
1 :Thread-1 
1 :Thread-0 
2 :Thread-1 
2 :Thread-0 
3 :Thread-1 
3 :Thread-0 
4 :Thread-1 
4 :Thread-0 
5 :Thread-1 
5 :Thread-0 
6 :Thread-1 
6 :Thread-0 
7 :Thread-1 
7 :Thread-0 
8 :Thread-1 
8 :Thread-0 
9 :Thread-1 
9 :Thread-0 

爲什麼兩個輸出都不同。

我用加入()與Th1對象。當TH0運行和JVM發現TH1線程,以便線程1,應首先完成了,然後線程0。

爲什麼其在沒有任何序列打印線程1,線程0。如果輸出會是這樣的,那麼join()方法有什麼用處?

誰能請我解釋輸出。

+0

那'th2.start();'應該是'th1.start();',正確? th/th0同樣的事情。 –

回答

1

這裏的問題是,兩個線程獨立啓動並開始打印內容,th0.startth1.start之間會發生什麼不確定性。

此外,它是在等待th1完成,th0th1相互執行其run方法獨立,這就是爲什麼每當你得到一個differente順序應用程序的主系統線程。

0

可以請您通過以下嘗試...

try { 
     th1.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

事實上,通過加入我們要說等待另一個線程atmost 10000ms ...如果其他線程沒完成(10000)方法在10000ms內,當前線程的執行開始。

使用的join()方法不指定此等待其他線程完成執行的時間...