通过继承Thread类并重写public void run()方法可定义任务逻辑,但必须调用start()才能启动新线程;直接调用run()仅同步执行,不创建线程。

通过继承 Thread 类并重写 run() 方法,可以定义线程要执行的任务逻辑;但真正启动独立线程,必须调用 start() 方法,而不是直接调用 run()。
继承 Thread 类并重写 run() 方法
这是创建线程的传统方式之一。你需要自定义一个类,让它继承 Thread,然后覆盖其 run() 方法,在其中编写希望在线程中异步执行的代码。
-
run()是线程的入口方法,类似程序的main(),但它不会自动启动新线程 - 重写时不要修改方法签名(必须是
public void run()) - 避免在
run()中抛出受检异常(checked exception),因为父类没声明;如需处理,应使用 try-catch 包裹
必须调用 start() 才能启动独立线程
很多人误以为调用 run() 就能开启新线程,其实它只是普通方法调用,仍在当前线程中同步执行。只有 start() 才会触发 JVM 创建新线程,并由该线程自动调用 run()。
- ✅ 正确:创建对象后调用
thread.start() - ❌ 错误:调用
thread.run()—— 没有新线程,只是顺序执行 - ⚠️ 注意:
start()只能调用一次,重复调用会抛出IllegalThreadStateException
简单示例(Java)
下面是一个完整可运行的例子:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("线程 " + getName() + " 执行完毕");
}
}
// 使用方式:
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.setName("Worker-1"); // 可选:设置线程名便于调试
t.start(); // ✅ 启动新线程
System.out.println("主线程继续执行");
}
}
输出中你会看到“主线程继续执行”很可能先于“线程 Worker-1 正在运行”,说明两个线程并发执行。
注意事项与替代建议
虽然继承 Thread 类简单直观,但在实际开发中更推荐使用 实现 Runnable 接口 或 使用 Lambda 表达式 的方式,原因包括:
- Java 不支持多继承,继承
Thread会占用唯一的父类位置 -
Runnable更符合面向接口编程思想,职责更清晰(定义任务,而非管理线程) - 线程池(如
ExecutorService)只接受Runnable或Callable,不接受Thread实例 - 多个线程复用同一任务对象时,继承方式难以复用,而
Runnable可以共享

















