Thread多次调用start方法问题
调用start()方法之后,不等线程执行结束,立刻再次调用start()方法
调用start()方法之后,不等线程执行结束,立刻再次调用start()方法,会抛出java.lang.IllegalThreadStateException
异常
示例:
private static void startedAndStarted() throws InterruptedException {
Thread t = new Thread(()->{
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t thread is over...");
});
t.start();
System.out.println("t thread state: "+ t.getState());
t.start();
}
结果:
t thread state: RUNNABLE
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)
at com.java.thread.ThreadNew.startedAndStarted(ThreadNew.java:25)
at com.java.thread.ThreadNew.main(ThreadNew.java:10)
t thread is over...
调用start()方法之后,等线程执行结束,立刻再次调用start()方法
调用start()方法之后,等线程执行结束,立刻再次调用start()方法,会抛出java.lang.IllegalThreadStateException
异常
示例:
private static void startAfterTerminated() throws InterruptedException {
Thread t = new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t thread is over...");
});
t.start();
TimeUnit.SECONDS.sleep(2);
System.out.println("t thread state: "+ t.getState());
t.start();
}
结果:
t thread is over...
t thread state: TERMINATED
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)
at com.java.thread.ThreadNew.main(ThreadNew.java:21)
结论
虽然两者都会抛出java.lang.IllegalThreadStateException
,但是本质是不一样的。第一个是重复启动,此时线程处于运行状态,是不允许的;而第二次则是在该线程生命周期已经被终结后企图启动,也是不允许的