重写 run() 方法是继承 Thread 类实现多线程的核心,必须严格保持 public void run() 签名,逻辑代码写入其中,通过 start() 启动新线程,不可直接调用 run()。

直接重写 run() 方法即可,这是继承 Thread 类实现多线程的核心步骤。
必须重写 run(),不能改名或换签名
Thread 类中 run() 是一个空的普通方法(非抽象),子类需用 @Override 明确覆盖它。方法签名必须严格一致:public void run() —— 返回值、方法名、参数列表都不能改动。
- 写成
public void start()或private void run()都不会被 JVM 调用 - 加参数(如
run(int n))属于重载,不是重写,启动线程时仍执行父类空逻辑
逻辑写在 run() 里,别在构造器或其它地方
线程真正执行的代码必须放在 run() 方法体内。构造器中初始化数据可以,但耗时操作或实际任务逻辑要移到 run() 中。
- 错误示例:在构造器里调用
System.out.println("hello")—— 这会在主线程执行,不是新线程 - 正确做法:把打印、循环、IO、计算等全部放进
run()方法体
启动线程用 start(),不是直接调用 run()
覆盖完 run() 后,必须通过 start() 方法启动线程。直接调用 run() 只是普通方法调用,仍在当前线程同步执行,不产生新线程。
- ✅
new MyThread().start();→ JVM 创建新线程并自动调用其run() - ❌
new MyThread().run();→ 没有新线程,只是顺序执行,和普通对象方法无异
注意 this 引用和变量作用域
run() 中可直接访问当前线程实例的成员变量和方法,无需额外传参。若需外部数据,建议在构造器中传入并保存为字段。
立即学习“Java免费学习笔记(深入)”;
- 例如:定义
private String taskName;,构造器赋值,在run()中使用System.out.println(taskName); - 避免在
run()中捕获局部变量(尤其是未声明为 final 或 effectively final 的),否则编译报错


















