这是我在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 - 如果线程已经启动。