2013-04-24 6 views
0

Так что скажите, что у меня есть 10 вещей для запуска, но у меня есть только три потока, которые запускаются за раз.Как дождаться окончания потока, прежде чем запускать больше в Java

ArrayList<NewThread> threads = new ArrayList<NewThread>(); 

for(int i = 1; i < args.length; i++) { 
    NewThread t = new NewThread(args[i]); 
    threads.add(newThread); 

    if((i%3) == 0) { 
     for (NewThread nt : threads) { 
     nt.join(); 
     } 
     threads.clear(); 
    } 
} 

Класс NewThreads реализует Runnable. Я думал, что метод join() будет работать, чтобы дождаться завершения потоков, прежде чем снова зациклиться и начать следующую серию потоков, но вместо этого я получаю исключение переполнения стека. Я думаю, что я выполняю join() неправильно, но я не уверен, как это сделать. Я сейчас делаю это как

public void join() { 
    this.join(); 
} 

в моем классе NewThread. Любые предложения о том, как получить эту работу или лучший способ сделать это?

+0

Как использовать пулы потоков и SingleThreadExecutor? http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html –

+0

Ну, это просто ошибка: удалите весь метод соединения: – xtraclass

+0

Если вы еще не начали нить, вы, вероятно, не хочу дождаться, когда он присоединится. 't.start()' then 't.join()'. – StoneBird

ответ

2

Это просто простая ошибка.

Удалить метод

public void join() { 
     this.join(); 
    } 

Этот метод снова и снова называет себя. NewThread должен расширять Thread.

Или второй путь:

держать метод и вызвать

 Thread.currentThread.join(); 

Остальное выглядит прекрасно.

+1

Спасибо, это сработало отлично и было просто. – Nuez

5

Вы implementins или присоединиться к наиважнейшему называть себя бесконечно

public void join() { 
    this.join(); // call myself until I blow up. 
} 

Самым простым решением является использование Thread.join() уже есть, но лучшее решением является использование размера пула потоков неподвижного таким образом Вы не Не нужно начинать и останавливать потоки, которые могут тратить много времени и кода.

Вы можете использовать ExecutorService

ExecutorService es = Executors.newFixedThreadPool(3); 
for(int i=0;i<10;i++) 
    es.submit(new Task(i)); 
Смежные вопросы