在java中在同一线程上调用start()方法两次,有时它会执行两次run()方法;内部究竟发生了什么



这是我在java版本"1.8.0_121"上运行的代码

class ThreadTest extends Thread
{
   ThreadTest()
   {
     run();
   }    
   public void run()
   {
     System.out.println("In run");
   }
}
class ThreadDemo
{
   public static void main(String a[])
   {
      ThreadTest t = new ThreadTest();
      t.start();
      System.out.println("Main after start 1 ");    
      t.start();    
      System.out.println("Main after start 2 ");    
   }
}

请看上面代码的输出

In run
Main after start 1
In run
Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at InheritanceChild.main(InheritanceChild.java:44)
C:Java>

我搜索了各种帖子,但他们只告诉java.lang.IllegalThreadStateException发生在你尝试在java中的同一个线程上调用启动方法两次时。 但就我而言,它在抛出java.lang.IllegalThreadStateException之前执行了两次run((方法。 谁能给我建议一下,内部到底发生了什么;我的意思是代码执行流程。(它是如何首先进行第二次 run(( 调用的?在哪一刻抛出异常?(

不是

start()两次调用run()。您的构造函数也调用 run() 。删除第二个start(),您仍然会看到它调用了两次。

您正在从构造函数调用 run(( 方法,这是您创建对象时的第一次执行。第二个是当您实际启动线程执行时,异常是第二次启动调用。

线程启动文档明确指出"多次启动线程绝不是合法的"。

公共无效开始(( 导致此线程开始执行;Java 虚拟机调用此线程的 run 方法。 结果是两个线程同时运行:当前线程(从调用 start 方法返回(和 另一个线程(执行其 run 方法(。

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

抛出: IllegalThreadStateException - 如果线程已经启动。

最新更新