继承Thread类创建线程需三步:定义子类并extends Thread、重写run()方法编写任务逻辑、创建实例后调用start()启动;必须调用start()而非run(),因start()由JVM调度新建线程执行run(),而直接调用run()仅是主线程内普通方法调用,无法实现多线程。

在 Java 中,通过继承 Thread 类创建线程是最基础的方式之一。核心思路是:定义一个类,让它继承 Thread,重写其 run() 方法,在里面编写线程要执行的任务逻辑,然后创建该类的实例并调用 start() 方法启动线程。
继承 Thread 类的基本步骤
只需三步,就能完成一个可运行的线程:
- 定义一个类(例如
MyThread),extends Thread - 重写
run()方法,在其中写你要在线程中执行的代码(比如循环打印、耗时计算等) - 在 main 方法中创建该类的对象,然后调用
start()—— 注意不是直接调用run()
为什么必须调用 start() 而不是 run()?
start() 是 JVM 识别并真正开启新线程的入口;它会为该线程分配资源、设置状态,并自动调用 run() 方法在新线程中执行。
而直接调用 run(),只是普通方法调用,仍在当前主线程中顺序执行,**不会产生新线程**,也就失去了多线程的意义。
一个完整示例
下面是一个打印 0~4 的简单线程:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
立即学习“Java免费学习笔记(深入)”;
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start(); // 启动第一个线程
t2.start(); // 启动第二个线程
}
}
运行后你会看到两个线程(如 Thread-0、Thread-1)交替输出数字,说明它们在并发执行。
需要注意的限制和问题
继承方式虽然简单,但有明显局限性:
- Java 不支持多继承,一旦继承了
Thread,就无法再继承其他类 - 线程任务与线程对象耦合在一起,不利于复用和扩展
- 实际开发中更推荐使用 实现 Runnable 接口 或 使用 ExecutorService 等更灵活的方式

















