如何重新启动死线程?

时间:2013-08-14 05:36:53

标签: java multithreading

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

7 个答案:

答案 0 :(得分:47)

Thread lifecycle image

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

所以没有办法将死线程恢复到可运行状态,而应该创建一个新的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);

查看Executor Interfaces

答案 3 :(得分:5)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

当run()方法的执行结束时,正如它所表示的作业已完成,它将进入死状态。它由JVM隐式完成。在死状态下,线程对象被垃圾收集。它是线程生命周期的结束。 一旦线程被删除,就无法重新启动(因为线程对象不存在)

enter image description here

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

答案 6 :(得分:3)

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

1新生州

2可运行状态

3运行状态

4封锁状态

5死亡状态

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

enter image description here

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

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