这是我在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()调用?并在哪一刻抛出异常?)
答案 0 :(得分:2)
start()
没有run()
两次致电run()
。您的构造函数也调用start()
。删除第二个elasticsearch/config/templates
,您仍然会看到它被调用两次。
答案 1 :(得分:0)
您正在从Constructor调用run()方法,这是您在创建对象时的第一次执行。第二个是你实际开始线程执行而异常是第二个开始调用。
线程启动文档明确说明"不止一次启动线程是不合法的#34;。
public void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法。 结果是两个线程同时运行:当前线程(从调用start方法返回)和 另一个线程(执行其run方法)。
不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
抛出: IllegalThreadStateException - 如果线程已经启动。