如何重新启动死线程?
将死线程恢复到可运行状态的所有不同可能性是什么。
如果你看一下线程生命周期图像,一旦你的线程终止,你就无法回到新的位置。
所以没有办法将死线程恢复到可运行状态 ,而是应该创建一个新的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状态。