当前位置: 首页 > 面试题库 >

为什么不能重新启动Java Thread对象?

拓拔弘扬
2023-03-14
问题内容

我知道不可能重新启动使用的Java Thread对象,但是我找不到 为什么 不允许这样做的解释。即使可以保证线程已完成(请参见下面的示例代码)。

我不明白为什么start()(至少是restart())方法不能以某种方式将Thread对象的内部状态重置为与刚创建Thread对象时相同的值。

示例代码:

class ThreadExample {

  public static void main(String[] args){

    Thread myThread = new Thread(){
      public void run() {
        for(int i=0; i<3; i++) {
          try{ sleep(100); }catch(InterruptedException ie){}
          System.out.print(i+", ");
        }
        System.out.println("done.");
      }
    };

    myThread.start();

    try{ Thread.sleep(500); }catch(InterruptedException ie){}
    System.out.println("Now myThread.run() should be done.");

    myThread.start(); // <-- causes java.lang.IllegalThreadStateException

  } // main

} // class

问题答案:

我知道不可能重新启动使用的Java Thread对象,但是我找不到为什么不允许这样做的解释。即使可以保证线程已完成(请参见下面的示例代码)。

我的看法是,线程可能直接绑定到实际的 本机 资源(出于效率或其他约束),而 本机
资源可以在某些操作系统中重新启动,而在其他操作系统中则不能重新启动。如果Java语言的设计者允许重新启动线程,则他们可能会限制可运行JVM的操作系统的数量。

想到这一点,我想不出一个允许线程或进程在完成或终止后重新启动的操作系统。当一个过程完成时,它就死了。您需要另一个,然后重新启动它。你永远不会复活。

除了底层操作系统所带来的效率和限制问题之外,还有分析和推理的问题。当事物是不可变的或具有离散的,有限的生命周期时,您可以考虑并发。就像状态机一样,它们必须具有终端状态。开始,等待,完成了吗?如果您允许线程复活,就很难轻易推断出类似的事情。

您还必须考虑重新线程的含义。重新创建其堆栈,其状态,是否可以安全地复活?您可以复活异常结束的线程吗?等等。

毛茸茸,太复杂。所有这些都是微不足道的收益。最好将线程保留为不可恢复的资源。



 类似资料:
  • 这是:“Parent root=fxmlloader.load(getClass().getResource(”sample.fxml“));” 我不明白剩下的部分,所以我希望你能轻松地解决这个问题:)

  • 问题内容: 有什么方法可以重新启动JVM?如in中,实际上不退出,而是关闭并重新加载所有类,然后从顶部运行main? 问题答案: 最好的选择可能是在一个循环中运行java解释器,然后退出。例如: 如果您希望完全重新引导或关闭,可以测试退出状态: 在Java程序中,可以使用System.exit(0)指示要“重新引导”,而可以使用System.exit(1)指示要停止并保持停止。

  • 我已经创建了一个可拖动和排序的项目。您应该能够将下拉元素向上拖动到红色框上。该元素将显示在红色框中,一些新的表单元素将显示在蓝色框中。然后,您应该能够将更多元素拖到红色框上,并对其重新排序。它的行为应该与jQuery中的示例类似。我实际上并不处理对象的放置,而是将其留给jQuery处理。 目前,我可以将新元素添加到红色框中,但是现有元素不会移动,以允许我将新元素放置在列表中的任何位置。此外,当我试

  • 问题内容: 想象一下以下课程: 我想重新启动线程以防万一。这不起作用。因为线程只能启动一次。第一个问题。为什么是这样? 据我所知,我必须重新创建的每个实例并调用以再次启动线程。如果是s,这不是很实际。我必须读取旧值的当前值,创建一个新值,并使用旧值在新对象中设置参数。第二个问题:这可以用更聪明,更轻松的方式完成吗? 问题答案: 之所以以这种方式实现threading.Thread,是为了保持线程对

  • 我的服务器工作得很好,当我运行节点app.js.然而,我试图使用nodemer来运行我的服务器,它不启动。 npm start显示以下错误: 我的包裹。json: 我的app.js 我已经尝试过: 删除node_modules并运行npm安装 删除package-lock.json,运行npm缓存清理--force并运行npm安装 删除所有文件,重复安装过程 添加npm到路径 这个问题的其他解决方

  • 我是C编程的初学者,如果我能得到一些关于如何重新启动程序的提示,我将不胜感激?我目前正在开发一个猜测游戏,用户有10次尝试猜测随机提供的秘密号码。我希望该程序能够从一开始就为用户提供新一轮游戏(尝试次数1猜测次数:),这意味着重新运行该程序。 以下是节目: