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


问题内容

我知道不可能重新启动使用的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的操作系统的数量。

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

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

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

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