将死线程带回可运行状态的所有不同可能性是什么。
答案 0 :(得分:47)
如果您查看线程生命周期图像,一旦线程终止,您将无法返回新位置。
所以没有办法将死线程恢复到可运行状态,而应该创建一个新的Thread实例。
答案 1 :(得分:11)
来自JavaDocs ...
不止一次启动线程永远不合法。特别是,a 一旦完成执行,线程可能无法重新启动。
你必须开始一个全新的实例。
最好,您要执行的操作应该包含在Runnable
界面中,这样您就可以将Runnable
简单地传递给Thread
的新实例
答案 2 :(得分:10)
我猜您扩展了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);
答案 3 :(得分:5)
线程是一个单独的轻量级进程,无论其他线程如何,它都独立执行。一旦执行完成,就无法重新启动它。
答案 4 :(得分:4)
另一个明显的解决方案是:如果你需要多次线程功能,不要让线程死掉。而不是让它退出,并因此终止自身,推动一段时间(真实)循环,在顶部有一个合适的等待。然后,您可以通过发信号通过它“重新启动”它的工作。
这比不断创建/终止/销毁线程更快,更安全,更有效。
答案 5 :(得分:3)
当run()方法的执行结束时,正如它所表示的作业已完成,它将进入死状态。它由JVM隐式完成。在死状态下,线程对象被垃圾收集。它是线程生命周期的结束。 一旦线程被删除,就无法重新启动(因为线程对象不存在)。
阅读更多关于线程生命周期的Here。
答案 6 :(得分:3)
线程在其生命中有许多不同的状态。
1新生州
2可运行状态
3运行状态
4封锁状态
5死亡状态
线程应处于上述任何一种状态,并且可以通过不同的方法和方式从一种状态移动到另一种状态。
当线程完成执行其run()方法时,该特定线程的生命周期结束。
我们可以通过为该特定线程调用stop()方法来杀死线程并将其发送到死亡状态。