将死线程带回可运行状态的所有不同可能性是什么?
7 回答
如果您查看线程生命周期图像,一旦您的线程终止,您就无法返回新位置。
所以没有办法将死线程恢复到可运行状态,而是应该创建一个新的 Thread 实例。
从JavaDocs ...
多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。
您必须启动一个全新的实例。
最好,您要执行的操作应该包含在一个Runnable
接口中,这样您就可以简单地Runnable
将Thread
我猜你扩展了这个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:使用ajava.util.concurrent.Executor
来执行Runnable
s。这将使线程管理与执行分离。
Executor executor = Executors.newSingleThreadExecutor();
...
SomeRunnable someRunnable = new SomeRunnable();
executor.execute(someRunnable);
看看执行器接口
该线程是一个独立的轻量级进程,它独立执行而与其他线程无关。一旦它的执行完成,就没有办法重新启动它。
另一个明显的解决方案是:如果您多次需要线程功能,请不要让线程死掉。与其让它退出并自行终止,不如在一个 while(true) 循环中推入,并在顶部进行适当的等待。然后,您可以通过发出信号使其“重新启动”其工作。
这比不断创建/终止/销毁线程更快、更安全、更高效。
当 run() 方法的执行结束时,因为它意味着完成的工作,它被带到死状态。它是由 JVM 隐式完成的。在死状态下,线程对象被垃圾回收。这是线程生命周期的结束。一旦一个线程被删除,它就不能再次重新启动(因为线程对象不存在)。
从这里阅读更多关于线程生命周期的信息。
线程在其生命周期中有许多不同的状态。
1 新生儿状态
2 可运行状态
3 运行状态
4 阻塞状态
5 死状态
线程应该处于上述任何一种状态,并且可以通过不同的方法和方式从一种状态移动到另一种状态。
当一个线程完成执行其 run() 方法时,该特定线程的生命周期就结束了。
我们可以通过为该特定线程调用 stop() 方法来终止线程并将其发送到死状态。