2013-08-05 2 views
2

я хочу знать, как перезапустить эту тему я убить нить с помощью метода присоединиться, но я получил это исключение: Исключения в потоке «главный» java.lang.IllegalThreadStateException менеджер нитки:перезагрузки Java нить после того, как присоединиться к методу

public void manage() { 

    while(true) 
    { 
     thread1.start(); 
     try { 
      thread1.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     thread2.start(); 
     try { 
      thread2.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Почему вы делаете действительно странную вещь - последовательно запускаете два потока, ожидая, что каждый из них завершит цикл join(), через некоторое время (true)? Почему бы не начать один поток, только один раз, чей метод run() содержит while (true) и просто последовательно вызывает код из вашего thread1 и thread2? Нет join(), нет непрерывного потока создания/завершения/уничтожения. –

ответ

5

Вы не можете перезапустить поток в Java. Как только он будет завершен, все будет сделано.

Вместо этого вы должны создать Thread потенциально используя тот же Runnable и начните новую тему. EDIT: Хотя вы могли бы потенциально использовать «старый» объект Thread в качестве Runnable для запуска нового потока, я бы избегал делать это, если это возможно. Я стараюсь держать Runnable и Thread очень раздельными; Я рассматриваю его как ошибку дизайна, что вы даже можете создать Thread, просто расширив его, и что Thread реализует Runnable.

Обратите внимание, что присоединение резьбы не убейте ее - она ​​просто ждет ее завершения. Это очень разные операции. Когда один поток (X) присоединяется к другому потоку (Y), в Y нет индикации, что что-либо ждет его завершения - нет даже намека , который он должен попытаться остановить.

+0

Я предполагаю, что 'new Thread (oldThread)' также будет работать ... – SLaks

+0

@SLaks Не уверен, что это такая хорошая идея, учитывая, что Thread - довольно тяжелый объект ... – assylias

+0

@SLaks: Потенциально, но я бы старайтесь избегать этого. Будет редактировать эти строки. –

2

Нить Java может выполняться только один раз.

Если вы хотите запустить его снова, создайте новый Thread примерно таким же Runnable.

+0

, то как я могу использовать метод соединения чтобы завершить эту нить? – user2625638

+0

@ user2625638: Точно так же вы вызываете 'join()' в любом другом потоке. Однако, если вы начинаете поток, а затем сразу же присоединяете его(), вы не получаете никакой пользы от использования потока. – SLaks

+0

Как я изменил важное значение (которое сначала остановило «поток») в классе «runnable». Поэтому я не мог просто использовать один и тот же. Мне пришлось переустановить «runnable», а затем создать новый «Thread» на новом «runnable». –