start()是启动线程的唯一合法方式,调用后jvm将线程加入调度队列并创建os线程,由调度器分配cpu时间片后自动执行run();直接调用run()仅为普通同步方法调用,不开启新线程。

Java 中调用 start() 方法并不会直接执行 run() 方法,而是通知 JVM 将该线程加入调度队列,由操作系统或 JVM 线程调度器在合适时机分配 CPU 时间片,从而真正触发 run() 方法的执行。
start() 是启动线程的唯一合法方式
直接调用 run() 方法只是普通方法调用,不会开启新线程——它仍在当前线程中同步执行,不具备并发性。只有 start() 才会触发 JVM 创建底层操作系统线程(如 pthread 或 Windows thread),并让其进入就绪状态。
- 一个线程对象只能调用一次
start();重复调用会抛出IllegalThreadStateException -
start()返回后,线程可能尚未执行run(),也可能正在执行,也可能已结束——这是典型的异步行为 - JVM 在内部为该线程分配栈空间、设置程序计数器,并将其注册到线程调度系统中
run() 的执行由 JVM 调度器接管
当 JVM 调度器选中该线程获得 CPU 时间片后,会自动调用其 run() 方法——这个调用是 JVM 内部完成的,开发者无法也不应干预调用时机或方式。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果线程继承
Thread类,JVM 会调用子类重写的run() - 如果线程通过
Runnable构造,JVM 实际调用的是Thread默认run()方法,该方法内部再委托给传入的Runnable.run() -
run()执行完毕后,线程自动终止,进入TERMINATED状态
底层依赖操作系统线程机制
Java 线程模型基于“一对一”映射(JVM 每个 Thread 对应一个 OS 线程),start() 最终会触发类似 pthread_create(Linux)或 CreateThread(Windows)的系统调用。
- 线程创建开销较大(涉及内存分配、上下文初始化等),因此不建议频繁创建/销毁线程
- 线程生命周期(NEW → RUNNABLE → BLOCKED/WAITING → TERMINATED)由 JVM 和 OS 共同维护
- 从调用
start()到run()开始执行,中间存在不可控延迟,取决于系统负载与调度策略
常见误区提醒
容易混淆 start() 和 run() 的行为本质:
- ❌
new Thread(() -> System.out.println("Hi")).run();—— 没有新线程,只是主线程里执行打印 - ✅
new Thread(() -> System.out.println("Hi")).start();—— 启动新线程,输出发生在另一个线程中 - ⚠️ 不要重写
start()方法:它已由 JVM 实现,重写会破坏线程启动逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










