Thread 之 start() 方法
案例代码
@Slf4j
public class Client {
public static void main(String[] args) {
Thread t1 = new Thread("t1") {
@Override
public void run() {
log.info("t1 start...");
}
};
t1.start();
}
}
t1.start() 到底做了哪些事情,我们可以看一下 Thread 类的 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) {
}
}
}
从上面的源码中可以看出在 start() 方法中又调用了 start0() 方法
private native void start0();
而 start0() 方法是 native 修饰的,其调用的是 C/C++ 的库函数,底层的逻辑也是由 C/C++ 实现的
其底层实际上的逻辑大致是,如果在 Java 中线程对象调用 start() 方法之后操作系统的任务调度器会进行任务调度,最终使该线程进入就绪状态,
等待操作系统分配 CPU 时间片,如果分配到了 CPU 时间片之后,那么将会执行线程对象中的 run() 方法
注意线程在执行 start() 方法之前线程的状态为 NEW,执行完 start() 方法之后线程的状态为 RUNNABLE
注意:start() 方法只能调用一次,如果多次调用 start() 方法,会抛出 java.lang.IllegalThreadStateException 异常