19

将死线程带回可运行状态的所有不同可能性是什么?

4

7 回答 7

54

线程生命周期图像

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

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

于 2013-08-14T05:40:56.853 回答
14

JavaDocs ...

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

您必须启动一个全新的实例。

最好,您要执行的操作应该包含在一个Runnable接口中,这样您就可以简单地RunnableThread

于 2013-08-14T05:38:53.813 回答
12

我猜你扩展了这个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来执行Runnables。这将使线程管理与执行分离。

 Executor executor = Executors.newSingleThreadExecutor();

 ...

 SomeRunnable someRunnable = new SomeRunnable();
 executor.execute(someRunnable);

看看执行器接口

于 2013-08-14T05:42:59.823 回答
5

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

于 2013-08-14T05:59:37.123 回答
4

另一个明显的解决方案是:如果您多次需要线程功能,请不要让线程死掉。与其让它退出并自行终止,不如在一个 while(true) 循环中推入,并在顶部进行适当的等待。然后,您可以通过发出信号使其“重新启动”其工作。

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

于 2013-08-14T08:19:37.920 回答
3

当 run() 方法的执行结束时,因为它意味着完成的工作,它被带到死状态。它是由 JVM 隐式完成的。在死状态下,线程对象被垃圾回收。这是线程生命周期的结束。一旦一个线程被删除,它就不能再次重新启动(因为线程对象不存在)

在此处输入图像描述

从这里阅读更多关于线程生命周期的信息。

于 2013-08-14T05:39:27.223 回答
3

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

1 新生儿状态

2 可运行状态

3 运行状态

4 阻塞状态

5 死状态

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

在此处输入图像描述

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

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

于 2013-08-14T06:34:01.977 回答