这个问题是我最近面试中被问到一个问题,我们知道开启一个线程调用Thread类的start方法,然后去调用RUNNABLE接口的run方法使线程处于一个运行的状态。
前言
从Thread类的源码中里面有个一个枚举State,可以看到线程的状态有NEW(新建),RUNNABLE(运行),BLOCKED(阻塞),WAITING(等待),TIMED_WAITING(带有超时时间的等待),TERMINATED(终止状态)
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
一次start运行结果
下面是正常Thread类调用一次start方法的执行结果
二次start运行结果
如果我们在theead.start();这一行下面在加一行一样的代码,使这个thread调用两次start方法,然后执行,我们可以看到控制台抛出了java.lang.IllegalThreadStateException的异常。
然后我们跟踪代码发现异常处,有个threadStatus !=0的时候抛出IllegalThreadStateException这个异常,我们在代码断点发现第二次进入start方法的时候threadStatus=5,我们看前面线程线State状态的定义此时线程处于 TIMED_WAITING的状态。
在第二次调用start()方法的时候,线程可能处于终止或者其他的状态,除了NEW状态其他状态都是不可以再次启动,因为线程状态是不可逆的。
下面是线程状态以及方法的对应图: