示例代码
public class TestMain {
public static void main(String[] args) throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("开始运行");
}
});
System.out.println("线程当前的状态为" + thread.getState());
thread.start();
System.out.println("start后线程当前的状态为" + thread.getState());
thread.start();
}
}
运行结果:
可以发现,第一次调用start()方法能够有结果,而第二次则报了IllegalThreadStateException异常。
原因分析
以下是start()方法小部分源码:
//线程一被new出来就会有这个变量,默认值为0,代表着线程处于NEW状态
private volatile int threadStatus = 0;
public synchronized void start() {
//如果线程状态不等于0,说明线程状态已经不是NEW了,不是NEW说明至少已经开始运行了,再走start()方法就没意义了,所以会抛出IllegalThreadStateException异常
if (threadStatus != 0)
throw new IllegalThreadStateException();
}
总结
线程连续两次调用start()方法,会抛出IllegalThreadStateException异常。