Java中`implements Runnable`与`extends Thread`的对比
Java中implements Runnable
与extends Thread
的对比
技术背景
在Java多线程编程中,创建线程有两种常见的方式:实现Runnable
接口和继承Thread
类。这两种方式都能实现多线程功能,但在实际应用中各有特点。理解它们的区别有助于开发者根据具体需求选择合适的方式来创建线程。
实现步骤
实现Runnable
接口
- 创建一个类实现
Runnable
接口,并实现run()
方法,该方法包含线程要执行的代码。 - 创建该类的实例。
- 创建
Thread
类的实例,并将实现Runnable
接口的类的实例作为参数传递给Thread
的构造函数。 - 调用
Thread
实例的start()
方法启动线程。
示例代码如下:
1 |
|
继承Thread
类
- 创建一个类继承
Thread
类,并重写run()
方法,该方法包含线程要执行的代码。 - 创建该类的实例。
- 调用该实例的
start()
方法启动线程。
示例代码如下:
1 |
|
核心代码
实现Runnable
接口的核心代码
1 |
|
继承Thread
类的核心代码
1 |
|
最佳实践
推荐使用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/