start()是启动新线程的唯一合法方式,会创建OS线程并发执行;run()只是普通方法调用,在当前线程同步执行,不涉及线程创建。

核心区别就一句话:start() 是启动新线程的唯一合法方式,run() 只是定义任务逻辑的普通方法。调用 start() 会真正创建操作系统线程并进入并发执行;直接调用 run() 则完全不涉及线程创建,所有代码仍在当前线程里同步跑。
线程是否真的被创建出来
这是最根本的分水岭:
- start():JVM 向操作系统申请资源,创建独立的 OS 线程,分配专属栈空间和线程 ID,把线程状态从 NEW 改为 RUNNABLE,并将其加入调度队列
-
run():不做任何系统级操作,就是一次普通的 Java 方法调用,连线程状态都不会变——哪怕你在里面写
Thread.sleep(10000),主线程也会卡住 10 秒
执行环境与并发性
看代码在哪跑、能不能并行:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- 调用 t.start() 后,
t.run()的内容会在新线程中执行,Thread.currentThread().getName()返回的是t的名字(如t1) - 调用 t.run(),所有逻辑都在当前线程(比如
main)中执行,Thread.currentThread().getName()永远是main -
t1.run(); t2.run();是严格串行的;t1.start(); t2.start();才可能真正并发
调用规则与安全性
行为约束完全不同:
-
start() 只能调用一次。第二次调用抛
IllegalThreadStateException——线程生命周期不可逆 - run() 可反复调用,没有任何限制,但每次都是在当前线程重跑一遍,毫无“重启线程”效果
- 只有通过 start() 启动的线程,才能被
interrupt()中断、被线程池管理、响应优先级设置
底层实现不在一个层级
技术本质差异明显:
-
start() 是
synchronized的 native 方法,内部调用start0(),最终依赖pthread_create等系统 API -
run() 是纯 Java 实现的普通实例方法,默认只是转发
target.run(),没有并发语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










