thread(runnable target) 通过封装 runnable 到 target 字段并调用 start() 触发 jvm native 层创建 os 线程,由新线程自动执行 target.run();手动调用 run() 仅是同步方法调用,无并发性。

用 Thread(Runnable target) 启动线程,表面看只是传个任务对象再调用 start(),但底层实际触发了一整套 JVM 级别的线程创建与调度机制。
Runnable 被封装进 Thread 实例
构造器 Thread(Runnable target) 会把 target 存入 Thread 对象的 this.target 字段。这个字段在后续 run() 方法中被检查和调用——如果 target != null,就执行 target.run();否则什么也不做。
注意:此时线程还没真正运行,只是完成任务绑定和初始化配置(如名称、优先级、是否守护线程等),这些都发生在 init() 方法里,由当前线程(比如 main)完成。
start() 触发 native 层线程创建
thread.start() 是关键分水岭:
- 它不直接执行
run(),而是调用本地方法start0(); -
start0()是 JVM 实现的 native 方法,负责向操作系统申请资源,创建真正的 OS 线程(如 Linux 下的pthread_create); - 新线程创建成功后,JVM 会自动让它执行该 Thread 实例的
run()方法——也就是你传入的target.run()。
run() 的实际执行者不是调用 start() 的线程
这是最容易误解的一点:
- 如果你手动调用
thread.run(),那只是普通方法调用,仍在当前线程(比如 main)中同步执行,毫无并发性; - 只有
start()才会让 JVM 派生出一个独立的执行流,让run()在新线程上下文中运行; - 新线程启动后,
run()内部访问的Thread.currentThread()就是它自己,不是原来的主线程。
为什么 Runnable 不直接启动?
因为 Runnable 只是一个接口,定义了“可运行”的契约,它本身没有线程生命周期管理能力:
- 没有
start()、interrupt()、isAlive()等控制方法; - 没有线程栈、ID、状态(NEW/RUNNABLE/BLOCKED…)、上下文类加载器等运行时属性;
- 所有这些基础设施都由
Thread类提供,Runnable只负责填充业务逻辑。
所以 Thread(Runnable target) 本质是「把任务委托给线程载体」,而真正的多线程能力全部来自 Thread 类对 JVM 线程模型的封装和 start0() 的底层介入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











