2015-04-24 2 views
0

Для примера у меня есть всего 5 нитей, основной поток (A) и 04 других подписок (B, C, D, E). Я хочу, чтобы поток E должен был дождаться завершения работ B, C. Я намерен использовать join(), но кажется, что основной поток также будет заблокирован. Мне нужен основной поток, и поток D может продолжать работать, пока поток E ждет поток B и C.
Я не знаю, как я могу реализовать это правильно. Было бы здорово, если кто-то может помочь.
Большое спасибоThreading waiting in 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

Вы можете использовать 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

Много возможностей, таких как CountDownLatch, или вы можете поместить join() вызовы в run() метод Thread Е.

0

Лучший способ, которым я могу думать, чтобы передать объект Threads B , C и E и дождаться, пока оба B и C не закончатся.

В Thread E вы должны иметь 2 линии ожидания:

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

и обе нити B и C должны заканчиваться lockObj.notify();

Я не проверял это, но теоретически она должна работать.