线程调用两次start方法会发生什么?

150 阅读1分钟

这个问题是我最近面试中被问到一个问题,我们知道开启一个线程调用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方法的执行结果

16A76EE0-43E2-4157-9144-3D3C1EA0AB1B.png

二次start运行结果

如果我们在theead.start();这一行下面在加一行一样的代码,使这个thread调用两次start方法,然后执行,我们可以看到控制台抛出了java.lang.IllegalThreadStateException的异常。

DF7F7064-2E39-433A-9809-55E435BFBD9E.png

然后我们跟踪代码发现异常处,有个threadStatus !=0的时候抛出IllegalThreadStateException这个异常,我们在代码断点发现第二次进入start方法的时候threadStatus=5,我们看前面线程线State状态的定义此时线程处于 TIMED_WAITING的状态。

5B7DC3EE-1435-471D-9932-831AB8066D5F.png 在第二次调用start()方法的时候,线程可能处于终止或者其他的状态,除了NEW状态其他状态都是不可以再次启动,因为线程状态是不可逆的。 下面是线程状态以及方法的对应图:

C1A4E234-EA0C-44DB-BAC0-DC202B893505.png