调用 start() 才能真正启动新线程,因为它是 JVM 底层 native 方法,负责创建线程、分配栈并调度;而 run() 只是普通方法,直接调用仍在当前线程同步执行,无并发效果。

调用 start() 而不是 run(),是因为只有 start() 才真正启动一个新线程;直接调用 run() 只是普通方法执行,仍在当前线程中运行,不产生并发效果。
为什么 start() 会开启新线程,而 run() 不会
start() 是 Thread 类的本地(native)方法,它由 JVM 底层实现:通知操作系统创建新线程、分配栈空间、将线程加入调度队列,并最终在新线程上下文中自动调用 run()。而 run() 本身只是一个普通实例方法,像调用任何 Java 方法一样——没有线程创建逻辑,纯同步执行。
常见错误写法与后果
以下代码看似启动了线程,实则只是顺序执行:
Thread t = new Thread(() -> System.out.println("Hello"));
t.run(); // ❌ 错误:没有新线程,输出发生在主线程中
- 程序仍单线程运行,无法利用多核 CPU
- 无法体现并发、竞态、同步等多线程特性
- 调试时发现“线程没跑起来”,往往就是误调了
run()
正确启动线程的步骤
- 继承
Thread类或实现Runnable/Callable - 重写
run()方法,定义要并行执行的逻辑 - 创建线程对象后,**唯一且必须**调用
t.start() - 不可重复调用
start()(会抛IllegalThreadStateException)
补充说明:run() 的作用不可替代
run() 是线程任务的入口方法,所有实际工作都写在里面。虽然不能直接调用它来“启线程”,但它被 start() 内部调用——这是设计分离:启动机制(start)和业务逻辑(run)解耦。你定义 run,JVM 负责在线程就绪后执行它。
立即学习“Java免费学习笔记(深入)”;


















