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 异常
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~