2016-07-06 3 views
0

Я использую более 5 потоков в моем коде, когда основной метод выполняет все потоки, вызывается в начале, как только все потоки активны, я хочу, чтобы основной поток останавливался, пока все дочерние потоки не будут мертвы. Если я использую join() метод для любого потока, тогда все остальные дочерние методы также приостанавливаются. В моем случае мне нужно только приостановить основной поток.Как сделать основной поток, чтобы дождаться завершения всего дочернего потока?

+3

Вы можете положить в какой-то код? Я хотел бы посмотреть, как и на что вы называете метод join. Метод join - лучший способ достичь того, что вы хотите сделать. Вероятно, вы, должно быть, делаете что-то неправильно, чтобы не работать. –

+3

'Если я использую метод join() для любого потока, тогда все остальные дочерние методы также приостанавливаются', другие потоки не должны приостанавливаться. похоже, вы сделали что-то неправильное. – TomN

ответ

3

Вам необходимо связаться с join после того, как все темы уже созданы. то есть:

for(int i = 0; i < numThreads; i++) { 
    threads[i].start(); 
} 

И только потом:

for(int i = 0; i < numThreads; i++) { 
    threads[i].join(); 
} 

выше будет работать.

0

Вы должны использовать CountDownLatch для этого:

Для основного потока

CountDownLatch latch = new CountDownLatch(5); //for 5 threads 
    for(int i = 0; i < 5; i++) { 
     new Thread(new Worker("thread " + i, latch)).start();; 
    } 
    latch.await(); //wait till all workers are dead 

Для рабочего потока

priavte CountDownLatch; 
    public Worker(String name, CountDownLatch latch) { 
     this.name = name; 
     this.latch = latch; 
    } 
    public void run() { 
     try { 
      System.out.println(name + " done!"); 
     } finally { 
      latch.countDown();//count down 
     } 
    } 
Смежные вопросы