对于刚接触Java并发编程的开发者来说,继承Thread类往往是最直观的入门方式。不过,要真正理解“多个线程并发执行”的核心概念,关键在于——创建并启动多个Thread实例,而不是继承多少次Thread类。每个实例调用start()之后,JVM都会为它分配一条独立的执行路径,从而实现真正的多线程并发运行。

继承 Thread 类的基本写法
实现方式十分简洁:定义一个类,让它继承Thread,然后重写run()方法。在run()中,放入你希望该线程执行的具体任务逻辑。以下是一个典型的示例:
class MyTask extends Thread {
private String name;
public MyTask(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(name + " 正在运行: " + i);
try {
Thread.sleep(500); // 模拟耗时操作
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}启动多个线程实现并发
继承一次Thread类,就能创建多个实例——这才是并发的精髓所在。具体要点如下:
- 每个实例代表一个独立的线程对象。
- 必须调用
start(),而不是run(),才能真正开启一个新线程。直接调用run()只是在当前线程内执行一个普通方法,无法达到并发的效果。 - 如果多个
start()调用几乎同时发生,操作系统会负责调度这些线程,让它们交替执行,这正是“多线程并发”的典型表现。
来看一个实际的启动代码示例:
public class Main {
public static void main(String[] args) {
MyTask t1 = new MyTask("线程-1");
MyTask t2 = new MyTask("线程-2");
MyTask t3 = new MyTask("线程-3");
t1.start(); // 启动线程1
t2.start(); // 启动线程2
t3.start(); // 启动线程3
}
}注意:不能重复 start 同一个线程
每个Thread实例只能调用一次start(),这一点需要特别留意——如果尝试对同一个实例再次调用start(),就会抛出IllegalThreadStateException。例如,t1.start(); t1.start();这种写法是错误的。如果希望多次执行相同的逻辑,正确的做法是新建不同的实例,比如new MyTask("A").start(); new MyTask("B").start();。
与 Runnable 方式的对比
继承Thread的方式虽然简单直观,但它有明显的局限性:Java不支持多继承,一旦类继承了Thread,就无法再继承其他类。因此,在实际工程中,更推荐采用Runnable或Callable配合Thread构造器的方式。这种做法能将任务逻辑与线程本身解耦,复用性和灵活性都更强。例如:new Thread(new MyRunnable()).start();,这种模式在处理多个相似任务时更加方便顺手。
