Java中`implements Runnable`与`extends Thread`的对比

Java中implements Runnableextends Thread的对比

技术背景

在Java多线程编程中,创建线程有两种常见的方式:实现Runnable接口和继承Thread类。这两种方式都能实现多线程功能,但在实际应用中各有特点。理解它们的区别有助于开发者根据具体需求选择合适的方式来创建线程。

实现步骤

实现Runnable接口

  1. 创建一个类实现Runnable接口,并实现run()方法,该方法包含线程要执行的代码。
  2. 创建该类的实例。
  3. 创建Thread类的实例,并将实现Runnable接口的类的实例作为参数传递给Thread的构造函数。
  4. 调用Thread实例的start()方法启动线程。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyRunnable implements Runnable {
public void run() {
// 线程要执行的代码
System.out.println("Running in a thread using Runnable");
}
}

// 启动线程
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}

继承Thread

  1. 创建一个类继承Thread类,并重写run()方法,该方法包含线程要执行的代码。
  2. 创建该类的实例。
  3. 调用该实例的start()方法启动线程。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyThread extends Thread {
public MyThread() {
super("MyThread");
}

public void run() {
// 线程要执行的代码
System.out.println("Running in a thread using Thread");
}
}

// 启动线程
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}

核心代码

实现Runnable接口的核心代码

1
2
3
4
5
6
7
8
9
10
public class MyRunnable implements Runnable {
@Override
public void run() {
// 具体业务逻辑
}
}

// 启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();

继承Thread类的核心代码

1
2
3
4
5
6
7
8
9
10
public class MyThread extends Thread {
@Override
public void run() {
// 具体业务逻辑
}
}

// 启动线程
MyThread myThread = new MyThread();
myThread.start();

最佳实践

推荐使用implements Runnable

  • 代码复用性:一个实现Runnable接口的类可以被多个线程共享,多个线程可以执行相同的任务。
  • 避免单继承限制:Java是单继承的,实现Runnable接口的类还可以继承其他类,提高了代码的灵活性。
  • 逻辑分离:将任务逻辑和线程执行分离,符合面向对象的设计原则。

使用extends Thread的场景

  • 需要重写Thread类的其他方法:如果需要对Thread类的某些方法进行特殊处理,可以选择继承Thread类。
  • 简单应用:在一些简单的应用中,继承Thread类可以更方便地实现线程功能。

常见问题

为什么implements Runnable更受推荐?

  • 灵活性:可以继承其他类,同时实现多线程功能。
  • 代码复用:多个线程可以共享同一个Runnable实例,提高代码的复用性。
  • 符合设计原则:将任务逻辑和线程执行分离,使代码结构更清晰。

继承Thread类有什么限制?

  • 单继承限制:由于Java是单继承的,继承了Thread类后就不能再继承其他类。
  • 资源开销:每个Thread实例都有自己的资源开销,而多个线程共享一个Runnable实例可以减少资源开销。

可以将Runnable对象传递给Thread类的构造函数,那Thread类和Runnable接口有什么关系?

Thread类实现了Runnable接口,因此Thread类本身也是一个Runnable对象。可以将Runnable对象传递给Thread类的构造函数,让Thread类来执行Runnable对象的run()方法。


Java中`implements Runnable`与`extends Thread`的对比
https://119291.xyz/posts/2025-04-24.java-implements-runnable-vs-extends-thread/
作者
ww
发布于
2025年4月24日
许可协议