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/java-implements-runnable-vs-extends-thread/