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 异常

 

 

 

posted @ 2023-01-05 21:13  变体精灵  阅读(96)  评论(0编辑  收藏  举报