start()是JVM启动线程的唯一合法入口,调用后线程进入RUNNABLE状态并由调度器择机执行run();重复调用或对非NEW状态线程调用会抛IllegalThreadStateException,而直接调用run()仅是同步方法执行,不创建新线程。

Java 中的 start() 方法不是手动“激活”线程的开关,而是**通知 JVM 为该线程分配系统资源、进入就绪状态,并由调度器择机执行其 run() 方法**。它不能被重复调用,也不能在已终止或已启动的线程上调用,否则会抛出 IllegalThreadStateException。
必须通过 Thread 实例调用 start(),而非直接调用 run()
直接调用 run() 只是普通方法调用,仍在当前线程中同步执行,不会创建新线程:
- ✅ 正确:创建
Thread对象后调用start()—— JVM 启动底层 OS 线程,随后自动调用run() - ❌ 错误:
new Thread(() -> {...}).run()—— 没有新线程,逻辑在主线程里串行执行
start() 前需确保线程处于 NEW 状态
只有刚构造完、尚未调用过 start() 的线程才处于 NEW 状态。可通过 Thread.getState() 检查(但通常无需显式检查,异常已足够明确):
- 新建线程后可立即调用
start() - 若已调用过
start(),再次调用会抛出异常 - 线程运行结束(
TERMINATED)后,不能再重启 —— Java 不支持线程复用,需新建实例
start() 是 JVM 与操作系统协作的入口点
调用 start() 后,JVM 执行以下关键动作:
- 为线程分配独立的程序计数器、Java 虚拟机栈和本地方法栈
- 向操作系统请求创建对应内核线程(如 Linux 的
clone()系统调用) - 将线程置为
RUNNABLE状态(注意:不等于正在 CPU 上运行,只是具备运行资格) - 一旦调度器选中该线程,JVM 就在其上下文中执行
run()方法体
常见误用与规避建议
避免以下典型错误:
- 对同一
Thread实例多次调用start()—— 改用新对象 - 在
run()方法中再调用start()—— 属于逻辑混乱,应使用循环或新线程实例 - 认为
start()会立即执行run()—— 它只发起异步启动请求,实际执行时机由调度器决定 - 忽略异常处理 —— 生产代码中应捕获
IllegalThreadStateException并记录或响应

















