如何重新启动死线程?

死线程恢复到可运行状态的所有不同可能性是什么。

线程生命周期图像

如果你看一下线程生命周期图像,一旦你的线程终止,你就无法回到新的位置。

所以没有办法将死线程恢复到可运行状态 ,而是应该创建一个新的Thread实例。

来自JavaDocs ……

不止一次启动线程永远不合法。 特别是,一旦完成执行,线程可能无法重新启动。

你必须开始一个全新的实例。

优选地,您要执行的操作应该包含在Runnable接口中,这样您就可以将Runnable简单地传递给Thread的新实例

我猜你扩展了Thread类,你已经覆盖了run方法。 如果你这样做,你将可运行的代码绑定到Thread的生命周期。 由于无法重新启动Thread因此您必须每次都创建一个新Thread 。 更好的做法是使用Runnable接口将代码从Thread的生命周期中分离出来。

只需在实现Runnable的类中提取run方法即可。 然后你可以轻松地重新启动它。

例如:

  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

该线程是一个单独的轻量级进程,无论其他线程如何,它都独立执行。 一旦执行完成,就没有办法重新启动它。

另一个明显的解决方案是:如果您需要多次线程function,请不要让线程死掉。 而不是让它退出,并因此终止自身,而是在一段时间(真实)循环中推进,并在顶部进行适当的等待。 然后,您可以通过发出信号来“重新启动”其工作。

这比不断创建/终止/销毁线程更快,更安全,更有效。

当run()方法的执行结束时,就像它所要完成的作业一样,它将被置于死状态。 它由JVM隐式完成。 在死状态下,线程对象被垃圾收集。 这是线程生命周期的结束。 删除线程后,无法再次重新启动(因为线程对象不存在)

在此处输入图像描述

阅读更多关于线程的生命周期。

线程在其生命中有许多不同的状态。

1新生州

2可运行状态

3运行状态

4被封锁的国家

5死亡状态

线程应处于上述任何一种状态,并且它可以通过不同的方法和方式从一种状态移动到另一种状态。

在此处输入图像描述

当线程完成执行其run()方法时,该特定线程的生命周期结束。

我们可以通过为该特定线程调用stop()方法来杀死线程并将其发送到Dead状态。