【问题标题】:Can I start a thread again after it has died?我可以在线程死亡后重新启动线程吗?
【发布时间】:2020-04-28 19:02:59
【问题描述】:

如果我在 Thread 对象上使用 start() 并且 run() 方法返回,是否可以再次调用 start()?

例如,

MyThread myThread = new MyThread();
myThread.start();
// run method executes and returns in 2 seconds
// sleep for 5 seconds to make sure the thread has died
myThread.start();

我只是想知道,因为我的代码抛出了 IllegalThreadStateExceptions,所以想知道是不是因为您不能执行上述操作。

【问题讨论】:

  • @Stephen 我确实查看了 javadoc,但只查看了 start() 方法,这听起来不太清楚。
  • 嗯?关于名为start() 的方法上的句子“多次启动线程永远不合法” 有什么不清楚的地方?
  • 好奇:你想做什么?我怀疑使用预定执行程序 (ScheduledExecutorService) 最接近您想要实现的目标,但请随时填写。

标签: java multithreading


【解决方案1】:

不,你不能。 Thread.start() 方法的 Javadoc 告诉你!

【讨论】:

  • 哎呀......所以“开始”意味着“在某个时候已经开始”,而不是“没有死”?我还能做些什么来重新启动线程吗?
  • “开始”出现在哪里?我正在查看的文档说“多次启动线程是不合法的”。如果您编写了 Runnable 而不是扩展 Thread,则执行器框架使您能够重新提交作业,或定期运行等。
  • download.oracle.com/javase/1.4.2/docs/api/java/lang/… "抛出:IllegalThreadStateException - 如果线程已经启动。"不过谢谢,至少我现在知道了。
  • javadoc 的意思是“调用start() 两次是不合法的”
  • 啊,是的。然后正如@GregInYEG 所说。这有点像Socket 上的isConnected() 方法——它只是告诉您套接字在某个时候已经连接。完全没用!
【解决方案2】:

来自评论:

我还能做些什么来重新启动线程吗?

您可以使用ThreadPoolExecutor,这将允许您传入任务并让服务将线程分配给任务。任务完成后,线程处于空闲状态,直到它得到下一个任务。

因此,您无需重新启动线程,而是重做/恢复任务。

【讨论】:

    【解决方案3】:

    没有。

    来自Javadoc for java.lang.Thread

    启动线程是不合法的 不止一次。

    【讨论】:

      【解决方案4】:

      来自 javadoc:

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

      有关更多信息,请参阅Thread.start() javadoc。

      还有其他方法可以完成您正在尝试做的事情。例如,您可以使用新线程来继续在已完成执行的线程中完成的工作。您可能还想调查java.util.concurrent package

      【讨论】:

        【解决方案5】:

        如果您希望线程多次停止并重新启动,也许有更好的方法来执行此操作。我在 C++ 中有一个 tile 缓存线程,它做类似的事情;它在完成时暂停,并在再次需要时取消暂停。我是 Java 新手,但据我所知,您可以使用 Object.wait() 暂停,使用 Object.notify() 恢复线程。也许您可以在文档中查看这些内容并重新设计您的线程以暂停和恢复而不是退出。

        【讨论】:

        • 不知道为什么你会反对它......它在 C++ 中工作......每次你需要同一个线程时启动一个新线程是一种浪费......如果你需要同一个线程为了保留它自己,最好简单地暂停和恢复它。
        • 使用waitnotify完全停放线程以用于执行多个任务的错误方法。顺便说一句,正确的方法是使用执行器(例如ThreadPoolExecutor)为您做线程停放。
        猜你喜欢
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        • 2011-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        相关资源
        最近更新 更多