摘要:public synchronized void start { #技术分享 if (threadStatus != 0) throw new IllegalThreadStateException; group.add(this);boolean start
不知道小伙伴们在面试的时候,有没有被面试官问过这一道面试题:同一个线程调用两次 start 方法会怎样?
可能小伙伴们都觉得这问题多少有点毛病,谁会没事去调用两次 start?
既然问都问了,我们直接去跑一下代码看看是什么情况:
大家都可以看到了,第二次调用 start 的时候,抛出了 java.lang.IllegalThreadStateException 异常。
在 java 中,Thread 类的 start 方法是用于启动一个新线程的,我们去看看 start 方法内部的源码:
public synchronized void start { #技术分享 if (threadStatus != 0) throw new IllegalThreadStateException; group.add(this);boolean started = false; try { start0; started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } }从中我们可以看到,当 threadStatus 变量不为0的时候,会抛出 IllegalThreadStateException 异常。而这个 threadStatus 变量为线程的状态变量。
group.add(this) 方法是将当前线程添加到线程组中。线程组用于管理一组线程,可以对其进行批量操作(如中断所有线程)。而 start0 是一个 native 方法用于启动线程。
private native void start0;因此当我们第一次调用 start 方法时,线程进入就绪(Runnable)状态,并等待线程调度器分配 CPU 时间片来执行其 run 方法。
public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;}Thread 类的内部是有一个名为 State 的枚举类的,它明确定义了一个线程的生命周期都有哪些状态。
当一个线程从 NEW 状态变为 RUNNABLE 状态后,它的生命周期已经开始了,直到它进入 TERMINATED 状态。线程生命周期的管理需要确保线程状态的一致性。
来源:墨码行者