2013-08-14 2 views
11

Каковы всевозможные возможности для приведения мертвой нити назад к runnable state.Как перезапустить мертвую нить?

+1

Нет! Вам гораздо лучше обматывать состояние вашего потока в объекте (возможно, «Runnable») и просто передавать этот объект в новый поток. – phs

+0

Вы не можете перезапустить поток! –

+6

Вам необходимо использовать передовые методы путешествия во времени. И вы должны избегать создания парадоксов ... например, когда поток возвращается вовремя и убивает свой родительский поток до его создания. –

ответ

40

Thread lifecycle image

Если вы посмотрите на жизнь Thread цикла изображения, нет никакого способа, вы можете вернуться в новое положение, как только ваш поток окончилась.

+6

Не можете найти источник этого изображения? – Uooo

+3

+1 хороший пост. @Uooo Откройте это [link] (http://faculty.inverhills.mnscu.edu/speng/cs1127/Notes/Ch23/LifeCycle.htm) и нажмите на диаграмму UML –

10

От JavaDocs ...

Он никогда не законно начать нить более чем один раз. В частности, поток не может быть перезапущен после завершения выполнения.

Вам нужно будет начать новый экземпляр.

Предпочтительно, чтобы действия, которые вы хотите выполнить, должны быть обернуты в интерфейс Runnable, таким образом, вы можете просто передать Runnable на новый экземпляр Thread

2

Когда выполнение прогона() метод является более, поскольку работа, о которой идет речь, делается, она доведена до мертвого состояния. Это делается неявно JVM. В мертвом состоянии объект потока - это сбор мусора. Это конец жизненного цикла нитки. Как только поток удаляется, его нельзя перезапустить снова (поскольку объект потока не существует).

enter image description here

Подробнее От Here о жизненном цикле Threads.

7

Я предполагаю, что вы расширили класс Thread, и вы переопределили метод run. Если вы это сделаете, вы привяжете исполняемый код к жизненному циклу Thread. Поскольку Thread не может быть перезапущен, вы должны создавать новый Thread каждый раз. Лучшей практикой является разделение кода на выполнение в потоке из жизненного цикла Thread с использованием интерфейса Runnable.

Просто извлеките метод run в класс, который реализует Runnable. Затем вы можете легко перезапустить его.

Например:

public class SomeRunnable implements Runnable { 

     public void run(){ 
     ... your code here 
     } 
} 

SomeRunnable someRunnable = new SomeRunnable(); 
Thread thread = new Thread(someRunnable); 
thread.start(); 

thread.join(); // wait for run to end 

// restart the runnable 
thread = new Thread(someRunnable); 
thread.start(); 

Эта практика позволяет также легко, если вам нужно помнить предыдущее состояние выполнения.

public class SomeRunnable implements Runnable { 

     private int runs = 0; 

     public void run(){ 
      runs++; 
      System.out.println("Run " + runs + " started"); 
     } 
} 

PS: Используйте java.util.concurrent.Executor выполнить Runnable с. Это отменит управление потоками.

Executor executor = Executors.newSingleThreadExecutor(); 

... 

SomeRunnable someRunnable = new SomeRunnable(); 
executor.execute(someRunnable); 

Посмотрите на Executor Interfaces

4

нить представляет собой отдельный процесс, свет веса, который выполняет независимо друг от друга, независимо от других потоков. Как только его выполнение будет завершено, нет никаких средств для его перезапуска.

2

Резьба имеет много разных состояний благодаря своей жизни.

1 Новорожденных государственного

2 Runnable государственного

3 Запуск государственного

4 заблокированного состояние

5 Dead State

Тема должна быть в одном состоянии выше и могут перемещаться из одного состояния в другое различными способами и способами.

enter image description here

Когда поток завершается выполнение его метод Run() жизненный цикл этой конкретной нити конец.

Мы можем убить поток, вызвав метод stop() для данного потока и отправить его в состояние «Мертвое состояние».

3

Другое очевидное решение: если вам нужна функция потока много раз, не позволяйте нить умирать. Вместо того, чтобы позволить ему выйти и таким образом закончить себя, запишитесь в течение (истинного) цикла с подходящим ожиданием в верхней части. Затем вы можете заставить его «перезапустить» свою работу, сигнализируя об этом.

Это намного быстрее, безопаснее и эффективнее, чем постоянное создание/завершение/уничтожение потоков.

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