2015-04-24 40 views
0

例如我有5個線程總數,主線程(A)和04個其他子線程(B,C,D,E)。我想要的是線程E需要等到線程B,C完成他們的工作。我打算使用join(),但似乎主線程也會被阻塞。我需要主線程,線程D可以在線程E正在等待線程B和C時繼續運行。
我不知道如何以正確的方式實現此功能。如果有人能提供幫助,那將會很棒。
非常感謝您在java中的線程等待

+1

使用['CountDownLatch'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html) – MadProgrammer

+0

您可以使用'FutureTask' –

+0

B,C ,D,E都是從A發起的? –

回答

1

run()方法可以使用CountDownLatch

類CountDownLatch

java.lang.Object 
java.util.concurrent.CountDownLatch 

public class CountDownLatch 
extends Object 

一個同步輔助,允許一個或多個線程等待,直到在其他線程正在執行的一組操作完成。

例如:

下面是一個完成信號,可以讓駕駛者要等到所有工人已經完成 -

class Worker implements Runnable { 
    private final CountDownLatch startSignal; 
    private final CountDownLatch doneSignal; 
    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { 
    this.startSignal = startSignal; 
    this.doneSignal = doneSignal; 
    } 
    public void run() { 
    try { 
     startSignal.await(); 
     doWork(); 
     doneSignal.countDown(); 
    } catch (InterruptedException ex) {} // return; 
    } 

    void doWork() { ... } 
} 
+0

啓動爲什麼明確擴展Object? – Mordechai

+0

@MouseEvent - 默認情況下,此類擴展Object類以繼承其屬性。 –

0

我能想到的最好的辦法是將對象傳遞給線程乙,C和E並等待,直到B和C都完成。

在線程Ë你應該有2個等待行:

lockObj.wait(); 
lockObj.wait(); 

而且兩者線程B和C應lockObj.notify();

我沒有測試爲此,但在理論上它應該工作。