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

时间:2017-05-17 09:48:48

标签: java multithreading

这是我在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中的同一个线程上尝试两次调用start方法时会发生java.lang.IllegalThreadStateException。    但在我的情况下,它在抛出java.lang.IllegalThreadStateException之前执行run()方法两次。    任何人都可以请教我,内部究竟发生了什么;我的意思是代码执行流程。 (它是如何在第一个位置进行第二次run()调用?并在哪一刻抛出异常?)

2 个答案:

答案 0 :(得分:2)

start()没有run()两次致电run()。您的构造函数也调用start()。删除第二个elasticsearch/config/templates,您仍然会看到它被调用两次。

答案 1 :(得分:0)

您正在从Constructor调用run()方法,这是您在创建对象时的第一次执行。第二个是你实际开始线程执行而异常是第二个开始调用。

线程启动文档明确说明"不止一次启动线程是不合法的#34;。

  

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

     

不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。

     

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

相关问题