В чем всевозможные возможности вернуть мертвый поток обратно в состояние runnable.
Как перезапустить мертвую нить?
Ответ 1
Если вы посмотрите на изображение жизненного цикла нити, вы не сможете вернуться в новую позицию после прекращения потока.
Итак, нет способа вернуть мертвый поток в состояние runnable, вместо этого вы должны создать новый экземпляр Thread.
Ответ 2
Из > JavaDocs...
Невозможно запустить поток более одного раза. В частности, нить не может быть перезапущена после завершения выполнения.
Вам нужно будет начать новый экземпляр.
Предпочтительно действия, которые вы хотите выполнить, должны быть завернуты в интерфейс Runnable
, таким образом вы можете просто передать Runnable
в новый экземпляр Thread
Ответ 3
Я предполагаю, что вы расширили класс 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
s. Это отменит управление потоками от выполнения.
Executor executor = Executors.newSingleThreadExecutor();
...
SomeRunnable someRunnable = new SomeRunnable();
executor.execute(someRunnable);
Взгляните на Интерфейсы исполнителя
Ответ 4
Нить представляет собой отдельный легкий вес, который выполняется независимо независимо от других потоков. Как только его выполнение будет завершено, нет никаких средств для его перезапуска.
Ответ 5
Другое очевидное решение: если вам нужна функция потока много раз, не позволяйте нить умирать. Вместо того, чтобы позволить ему выйти и таким образом закончить себя, запишитесь в течение (истинного) цикла с подходящим ожиданием в верхней части. Затем вы можете заставить его "перезапустить" свою работу, сигнализируя об этом.
Это намного быстрее, безопаснее и эффективнее, чем постоянное создание/завершение/уничтожение потоков.
Ответ 6
Когда выполнение метода run() завершено, поскольку задание, о котором идет речь, выполняется, оно приводится в мертвое состояние. Это делается неявно JVM. В мертвом состоянии объект потока - это сбор мусора. Это конец жизненного цикла нитки. Как только поток удаляется, его нельзя перезапустить снова (поскольку объект потока не существует).
Подробнее Здесь о жизненном цикле потоков.
Ответ 7
Нить имеет много разных состояний благодаря своей жизни.
1 Состояние новорожденных
2 Runnable State
3 Состояние выполнения
4 Заблокированное состояние
5 Dead State
Тема должна быть в любом состоянии выше, и она может перемещаться из одного состояния в другое различными способами и способами.
Когда поток завершен, выполняя свой метод run(), жизненный цикл этого конкретного потока заканчивается.
Мы можем убить поток, вызвав метод stop() для этого конкретного потока и отправить его в Dead State.