2013-08-12 2 views
2

Мне нужно запустить несколько потоков || ly и после выполнения всех этих потоков продолжить поток. Для, например, у меня есть один основной поток и 3 суб темы, моя потребностьЗапустить несколько потоков одновременно, а затем запустить основной поток

run main thread 
pause main thread 
run all 3 sub threads ||ly 
after complition resume main thread 

создать класс extends Thread и вызвать метод запуска всех этих ниток, но это не решает мою проблему.

Мой код:

for (MyThread myThread : myThreads) { 
    myThread.start(); 
} 

Спасибо за помощь.

+3

вызовов 'join' на всех трех потоков. –

+0

@downvoter, пожалуйста, прокомментируйте –

ответ

3

Thread.join(); Попробуйте использовать

public class ThreadDemo implements Runnable { 

    public void run() { 

     Thread t = Thread.currentThread(); 
     System.out.print(t.getName()); 
     //checks if this thread is alive 
     System.out.println(", status = " + t.isAlive()); 
    } 

    public static void main(String args[]) throws Exception { 

     Thread t = new Thread(new ThreadDemo()); 
     // this will call run() function 
     t.start(); 
     // waits for this thread to die 
     t.join(); 
     System.out.print(t.getName()); 
     //checks if this thread is alive 
     System.out.println(", status = " + t.isAlive()); 
    } 
} 

Выход :

Thread-0, status = true 
Thread-0, status = false 

Для справки: stack-over-flow link.

+0

Связывание стеков - это совершенно правильный способ ответа, особенно дублирующий вопрос (который, безусловно, есть). – Gusdor

+0

@ Гусдор НЕТ !!! ссылки только ответы не приветствуются! Некоторые люди ошибаются, и они должны. Я более терпелив (обычно). –

+0

@Gusdor, если это дублированный вопрос, тогда вы должны проголосовать за закрытие или закрытие. Кроме того, вы можете снизить вопрос об отсутствии исследований. –

0

Вы можете позвонить join() в потоки. Если предположить, что ваши нити в myThreads, и вы не хотите, чтобы нить быть прерывистым

// ... 
// create threads and start them 
// ... 
for (Thread t : myThreads) { 
    while (t.isAlive()) { 
     try { 
      t.join(); 
     } catch (InterruptedException e) { } 
    } 
} 

Если это должен быть прерывистым:

// ... 
// create threads and start them 
// ... 
for (Thread t : myThreads) 
    t.join(); 
+1

Вы переходите к дополнительной неприятности в том, чтобы сделать этот код бесперебойным.Это редкость, обычно люди делают свой код бесперебойным и/или непониманием. –

+0

Если требуется дождаться завершения всех трех подволокон, я думаю, что лучше сделать это таким образом. На всякий случай. – bennihepp

+1

Требование будет полностью, и я могу сказать, что он удовлетворен, если код позволяет себя прервать. Прерывания не выходят из-под контроля, они должны быть выпущены в результате явного намерения прервать застрявшую нить. –

1

Забудьте о «приостановке» потоков. Ваш график должен быть

  1. Инициировать X действия на X потоков
  2. Подождите все нити, чтобы закончить
  3. результатов процесса (если таковые имеются)

Так как же вы ждете нитей, чтобы закончить? Вам нужен механизм синхронизации. Это часто «флаги» уровня OS, называемые семафорами, но java-библиотека дает вам несколько способов сделать это. Вы получите много из this series, в частности part 2: Thread Synchronization

+1

Пожалуйста, не просто разместите ссылку или два, и уходите. Некоторый пример кода был бы приятным. Связи исчезают со временем, и они требуют дополнительного клика, даже если они не исчезают. Не говоря уже о том, что примеры в учебном руководстве, вероятно, являются более сложными, чем то, что на самом деле нуждается. –

+0

То, что требуется OP, - это тщательная перемотка резьбы. Эта очень короткая серия научила меня всему, что мне нужно было знать о потоке java, планировании и синхронизации. Он был опубликован в 2002 году! 11 лет, никаких исчезновений. Я не ожидаю, что это будет окончательный ответ (удача, определяющая это), но яркий свет на большом ресурсе имеет свою ценность. «... стоить дополнительный клик». Печаль во благо. Должны ли мы помещать интернет на одну страницу с помощью якорей? Целая библиотека в одной книге? – Gusdor

+0

Или вы могли бы фактически ответить на вопрос OP (в идеале с некоторым объяснением) и включить ссылку как «дальнейшее чтение» –

0

CountDownLatch более гибкий механизм, то Thread.join. Он делает именно то, что вы хотите. Предпочитаю java.util.concurrent.* вместо старых встроенных методов Java.

Преимущества:

  1. Использование CDL вы имеете дело с одним объектом, а не кучу ниток. Это может упростить код.
  2. Он имеет метод getCount(), который может использоваться для реализации индикатора выполнения. С join s его гораздо сложнее.
  3. await(long timeout, TimeUnit unit) можно считать более удобным, чем join(long millis)
+1

Казалось бы, 'Thread # join' также делает именно то, что хочет OP. Что еще может предложить CDL? Делает ли это более то, что хочет OP? В менее строках кода? Более надежно? –

+0

Ну, я думаю, что основное различие будет в строках кода между этими подходами. Для примера HelloWorld это не имеет значения, но для большого проекта это делает. – Mikhail

+0

Проблема OP решена «по-настоящему» с использованием «ExecutorService», а не «CountDownLatch». –

Смежные вопросы