Как перезапустить мертвую нить?

В чем всевозможные возможности вернуть мертвый поток обратно в состояние runnable.

Ответ 1

Thread lifecycle image

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

Итак, нет способа вернуть мертвый поток в состояние 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. В мертвом состоянии объект потока - это сбор мусора. Это конец жизненного цикла нитки. Как только поток удаляется, его нельзя перезапустить снова (поскольку объект потока не существует).

enter image description here

Подробнее Здесь о жизненном цикле потоков.

Ответ 7

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

1 Состояние новорожденных

2 Runnable State

3 Состояние выполнения

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

5 Dead State

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

enter image description here

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

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