2017-02-16 79 views
-1

我學習線程,現在在學校裏,我們不得不編寫一個使用多線程的程序,然而,直到我用它沒有正常工作thread.join()的Thread.join()的解釋

它像它應該現在,但我不完全確定發生了什麼。

本來我有這樣的事情。它導致線程的輸出相互衝突。

t1.start(); 
t2.start(); 
t3.start(); 

然後我做到了這一點,輸出結果很好,達到了正確的答案。

t1.start(); 
t1.join(); 
t2.start(); 
t2.join(); 
t3.start(); 
t3.join(); 

我的問題是,第一個例子與第二個例子相比發生了什麼?我一直在谷歌搜索和搜索stackoverflow,但似乎無法找到一個完全幫助我理解的答案。

+0

如果你的程序沒有在調用'。加入前的工作()'那麼你最有可能遇到同步問題(沒有整個代碼很難說)。如果您在3個線程中共享和修改相同的對象,您可能需要使用某種同步方式進行研究。 – Jayfray

+0

這正是我現在正在研究的內容,我偶然發現了一篇文章。我正在跨線程共享2D陣列。 – sbowde4

+1

您很可能想查看'synchronized'關鍵字或[ReentrantLock](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html) – Jayfray

回答

3

t.join()導致當前線程暫停執行,直到t的線程終止。

通過這樣做:

t1.start(); 
t1.join(); 
t2.start(); 
t2.join(); 
t3.start(); 
t3.join(); 

沒有理由使用線程...

thead.join()使用例如:

比方說,你需要加密3個文件, 您想要使用線程來獲得更快的處理時間,並且您想知道需要多少時間:

int startTime = System.currentTimeMillis(); 
firstFileEncryptorThread.start(); 
secondFileEncryptorThread.start(); 
thirdFileEncryptorThread.start(); 

firstFileEncryptorThread.join(); 
secondFileEncryptorThread.join(); 
thirdFileEncryptorThread.join(); 

System.out.println(System.currentTimeMillis() - startTime); 
+1

詳細說明,因爲在開始下一個線程之前,您總是等待前一個線程完成,因此永遠不會有超過1個線程同時運行,這幾乎完全違背了使用線程的目的。 – Carcigenicate

+0

我明白了,我看到一篇關於線程同步的文章,但是在我對它進行評論時它被刪除了。我的線程都在相同的二維數組上執行操作。所以,而不是做thread.join(),我將看看線程同步 – sbowde4

+0

「沒有理由使用線程...」,所以join()方法是由錯誤引入的? :-)事實上,如果一個線程等待輸入來自另一個線程終止的結果,則必須使用corse的'join()' – davidxxx

0

作爲一個javadoc:

等待此線程死亡。此方法的調用在 完全相同的行爲方式調用

所以,當你調用t1.join();線程在至極,你所撥打電話等待到t1執行下一行之前完成。如果t1從未完成,則下一行永遠不會執行。

+0

所以t2不依賴於t1?這是否意味着它們可以並行運行? – sbowde4

+0

這就是線程的概念。通過執行檢查:t1.start(); t2.start(); t1.join(); – JFPicard

0

第二個例子你所做的實際上與單線程類似 - 意味着你運行一個線程,等待它完成並且運行下一個線程。

public final void join():這個java線程連接方法使當前線程等待,直到它被調用的線程死亡。如果線程中斷,則會引發InterruptedException。

在第一個例子 - 所有線程並行

運行可以看到類似的問題here