Thread 之 start() 方法

案例代码

1
2
3
4
5
6
7
8
9
10
11
12
@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() 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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() 方法

1
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 @   变体精灵  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示