【问题标题】:How can a dead thread be restarted? [duplicate]如何重新启动死线程? [复制]
【发布时间】:2013-08-14 05:36:53
【问题描述】:

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

【问题讨论】:

  • 无!您最好将线程的状态包装在一个对象中(可能是Runnable),然后将该对象传递给一个新线程。
  • 你不能重启线程!
  • 您需要使用先进的时间旅行技术。而且你必须避免产生悖论......就像当一个线程回到过去并在它被创建之前杀死它的父线程。
  • @StephenC 我猜 ATTT 包含在 Java 8 中,不是吗? :-)
  • 有一个attt8.jar

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

  • 你能给出这张图片的来源吗?
  • +1 好帖子。 @Uooo 打开这个link 然后点击UML图
【解决方案2】:

来自JavaDocs...

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

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

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

【讨论】:

    【解决方案3】:

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

    PS:使用java.util.concurrent.Executor 来执行Runnables。这将使线程管理与执行分离。

     Executor executor = Executors.newSingleThreadExecutor();
    
     ...
    
     SomeRunnable someRunnable = new SomeRunnable();
     executor.execute(someRunnable);
    

    看看Executor Interfaces

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          阅读来自Here 的更多关于线程生命周期的信息。

          【讨论】:

            【解决方案7】:

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

            1 个新生儿状态

            2 可运行状态

            3 运行状态

            4 阻塞状态

            5 死状态

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

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

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

            【讨论】:

              猜你喜欢
              • 2010-10-02
              • 1970-01-01
              • 1970-01-01
              • 2015-10-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多