如何重新启动一个已停止的线程?

19

如何将死亡线程恢复为可运行状态的所有可能方法。


1
最好的做法是将线程状态封装在一个对象中(例如一个Runnable),然后将该对象传递给新线程。 - phs
6
你需要运用先进的时间旅行技术。同时,你必须避免产生悖论...就像一根线回到过去,在它被创建之前杀死了它的父亲线一样。 - Stephen C
有一个 attt8.jar 文件。 - Rubens Mariuzzo
@Uooo - 是的,但是有出口限制,特别是如果你来自斯卡罗。 - Stephen C
不行,一旦线程结束就无法再次启动。要重新启动线程,您需要暂停线程,以便可以恢复它。 - Vighanesh Gursale
显示剩余2条评论
7个回答

54

线程生命周期图像

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

因此,没有办法将已死亡的线程带回可运行状态,而应该创建一个新的线程实例。


7
你能提供这张图片的来源吗? - Uooo
3
+1 不错的帖子。@Uooo 打开这个链接,点击 UML 图表。 - Suresh Atta

14

根据JavaDocs的说明...

在任何情况下都不能启动同一个线程超过一次。特别是,一旦线程执行完成,它就不能重新启动。

您需要启动一个全新的实例。

最好将要执行的操作封装在Runnable接口中,这样您就可以简单地将Runnable传递给新的Thread实例。


12

我猜您扩展了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");
      }
 }

提示:使用java.util.concurrent.Executor来执行Runnable。这将把线程管理与执行分离。

 Executor executor = Executors.newSingleThreadExecutor();

 ...

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

请查看执行者接口


5

线程是一种独立于其他线程执行的轻量级进程。一旦它的执行完成,就没有任何方法可以重新启动它。


4
另一个明显的解决方案是:如果你需要线程功能多次使用,则不要让线程终止。 不要让它退出和终止自身,而是将其放入一个while(true)循环中,并在顶部设置适当的等待时间。然后,通过发出信号可以使其“重新启动”工作。
这比不断创建/终止/销毁线程更快,更安全,更有效。

3
当run()方法的执行结束时,由JVM隐式地将其置于死亡状态,因为它所执行的任务已经完成。在死亡状态下,线程对象被垃圾回收。这是线程生命周期的终点。一旦线程被移除,它就不能重新启动(因为线程对象不存在)
阅读更多关于线程生命周期的信息,请点击此处

3

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

1 新生状态

2 可运行状态

3 运行状态

4 阻塞状态

5 完成状态

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

enter image description here

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

我们可以通过调用stop()方法来终止特定线程并将其置于完成状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接