2013-01-25 28 views
0

我正在研究java中的線程。在線程中理解join()的概念的簡單例子

我只想一個簡單的例子,它解釋了在線程中使用join()。我看到這個鏈接..

Understanding join() method example

但還是無法理解的概念。

任何人都可以解釋我在線程中使用join()的概念。

任何解釋,這將對我非常有幫助。

謝謝。

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html –

+0

我想知道從downvoters downvoting的振振有辭 –

+0

http://www.avajava.com/tutorials/課程/ how-do-i-use-threads-join-method.html –

回答

1

Thread.join()導致當前線程在它恢復執行之前等待您調用join()的線程死掉。

2

我能想到的最簡單的解釋是,連接使得調用者線程等待指定線程的完成。

如果你有一個「主線程」和「線程A」,如果你從主線程調用A.join(),主線程將等待線程A完成。

關於併發的Java SE的手冊頁應該幫助你在這裏:http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

+0

但isAlive()也做同樣的事情嗎?那麼爲什麼提供join()呢? –

+1

錯了。 isAlive()只返回true或false來表示線程是否存在。它不會導致調用線程等待。 – Aurand

0

的Thread.join()塊(不返回),直到你完成加入線程。

這不是等待某個線程完成的唯一方法,但它是CPU使用率最高的一種方式。試想一下,如果你有這樣的(僞)一個循環:

while(!thread.isAlive()) 
{ 
Sleep(1); 
} 

這理應做同樣的事情......但是,每秒1000次,它會醒來,檢查變量,回去睡覺。這意味着1000個上下文切換(這是昂貴的),並且程序結果會變慢。這被稱爲'spinlocking'或'busywaiting',並且在編程中被忽視,因爲它無緣無故地消耗CPU。

+0

如果我有3個線程對象,像t1,t2,t3和t1.join(); t2.join(); t3.join()。所以這裏t1,t2,t3同時執行,t2不等待t1完成,爲什麼這樣呢? –

+0

..因爲t2沒有在t1上調用join()。 –

+0

@MartinJames你的意思是說t1和t2在主線程上調用join()。我對嗎?? –

0

我做了一些實驗,這裏是結果:1.首先啓動線程t3。 2.啓動t1然後3.創建t2和t2連接運行線程t1。 根據定義,t2應該等待t1死亡,然後它應該開始。

觀察:我呼籲等待t1,所以t1暫停但沒有死亡,但我看到然後t2開始爲什麼?

public class TestThreadJoin { 

    public static void main(String[] args) { 
     final Thread t3 = new Thread(new Runnable() { 
      public void run() { 
       System.out.println("R3");  
      } 
     }); 
     t3.start(); 

     final Thread t1 = new Thread(new Runnable() { 
      public void run() { 
       System.out.println("R1 before"); 
       try { 
       perform(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("R1 after"); 
      } 
      private void perform() throws InterruptedException { 
       synchronized(this){ 
        wait(5000); 
       } 
      } 
     }); 
     t1.start(); 
     Thread t2 = new Thread(new Runnable() { 
      public void run() { 
       System.out.println("R2"); 
       try { 
        t1.join(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t2.start(); 

    } 
}