当前位置: 首页 > news >正文

Java 中创建线程:继承 Thread vs 实现 Runnable 的区别

在 Java 多线程编程中,创建线程最常见的两种方式就是继承 Thread 类实现 Runnable 接口,今天我们就来把这两种方式掰扯清楚,帮你彻底搞懂它们的区别和适用场景。

一、两种方式的基础实现

先看最直观的代码示例,感受一下两种写法的区别。

1. 继承 Thread 类

// 自定义线程类,继承Thread public class MyThread extends Thread { // 重写run()方法,定义线程要执行的任务 @Override public void run() { System.out.println("线程运行中:" + Thread.currentThread().getName()); } public static void main(String[] args) { // 创建线程对象并启动 MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.start(); // 启动第一个线程 thread2.start(); // 启动第二个线程 } }

2. 实现 Runnable 接口

// 实现Runnable接口,定义任务类 public class MyRunnable implements Runnable { // 实现run()方法,定义线程要执行的任务 @Override public void run() { System.out.println("线程运行中:" + Thread.currentThread().getName()); } public static void main(String[] args) { // 创建任务对象 MyRunnable runnable = new MyRunnable(); // 同一个任务对象,创建多个线程 Thread thread1 = new Thread(runnable, "线程1"); Thread thread2 = new Thread(runnable, "线程2"); thread1.start(); thread2.start(); } }

二、核心区别对比

我们从几个关键维度来拆解两者的差异

对比维度继承 Thread 类实现 Runnable 接口
继承限制Java 不支持多继承,继承 Thread 类后无法再继承其他类接口支持多实现,实现 Runnable 后仍可继承其他类
任务共享每个线程对象是独立的,无法共享同一个任务实例多个 Thread 对象可以共用同一个 Runnable 任务,天然支持资源共享
耦合度线程对象和任务逻辑耦合在一起线程对象和任务逻辑分离,解耦更彻底
扩展性扩展性较差,只能通过重写 run () 方法扩展扩展性更好,后续可以很方便地配合线程池等高级 API 使用

三、关键差异深度解析

1. 单继承限制的影响

Java 是单继承语言,如果你的类继承了Thread类,就不能再继承其他父类了,这会严重限制你的类的扩展能力。

举个例子:如果你的业务类本身需要继承一个BaseService父类,就无法再继承Thread,这种情况下只能选择实现Runnable接口。

2. 资源共享的能力差异

实现Runnable接口最大的优势就是可以让多个线程共享同一个任务实例。比如多个线程处理同一个计数器、同一个任务队列,用Runnable就非常方便,而继承Thread类的方式每个线程都是独立的对象,很难实现共享。

3. 代码解耦的设计思想

继承Thread类的方式,是把 “线程对象” 和 “任务逻辑” 写在了同一个类里,耦合度很高;而实现Runnable接口的方式,是把 “任务逻辑” 封装在 Runnable 中,再交给 Thread 去执行,完全遵循了 “线程是执行载体,任务是业务逻辑” 的设计原则,解耦更清晰,也更符合面向对象的设计思想。

四、什么时候该用哪种方式?

优先推荐:实现 Runnable 接口

绝大多数场景下,都推荐你用实现Runnable接口的方式:

你的类需要继承其他父类时

需要多个线程共享同一个任务 / 资源时

后续需要使用线程池、Callable 等高级多线程 API 时

追求代码解耦和扩展性时

可以使用:继承 Thread 类

只有在这些简单场景下,可以考虑继承 Thread 类:

你的类不需要继承其他类,也不需要共享任务

任务逻辑非常简单,只是快速创建一个独立的线程执行任务

教学演示或小型 Demo 场景,代码更直观

五、补充:start () 和 run () 的小误区

不管哪种方式,启动线程都必须调用start()方法,而不是直接调用run()方法!

start():会启动一个新线程,让线程进入就绪状态,等待 CPU 调度后自动执行run()方法

run():只是一个普通的方法调用,直接调用的话不会启动新线程,只会在当前线程中同步执行代码

六、总结

场景推荐方式
多线程共享任务 / 资源实现 Runnable
类需要继承其他父类实现 Runnable
追求解耦和扩展性实现 Runnable
快速创建简单线程 Demo继承 Thread

一句话总结:实现 Runnable 接口是 Java 多线程编程的主流方式,继承 Thread 类更多是入门阶段的写法,实际开发中基本都会用 Runnable。

http://www.jsqmd.com/news/989047/

相关文章:

  • 数据的加密与解密(01:00)
  • 数据的加密与解密(01:15)
  • MC9S12XE GPIO深度解析:从PIM寄存器到工程实践
  • 2026医疗门技术细节拆解与专业厂家选型推荐:河北电磁屏蔽门/河北监狱门/河北钢制平开门/河北防弹门窗/实力盘点 - 优质品牌商家
  • 基于AT89C52和MPX4115的胎压监测Proteus仿真套件(含源码、电路图、论文)
  • 数据的加密与解密(01:04)
  • 数据的加密与解密(01:09)
  • 给自己的 Web AI 接入联网检索:Tavily + 后端上下文注入 + 前端来源展示
  • 成都美容院装修品牌实测:三家本土服务商核心能力对比 - 优质品牌商家
  • 2026年 电线电缆厂家推荐排行榜:阻燃电缆、电力电缆、家装电线、特种电缆、矿用电缆品牌实力榜 - 品牌发掘
  • 2026年新消息:加热护肩销售公司如何选?聚焦佳沛电器综合实力解析 - 品牌鉴赏官2026
  • 2026年新消息:特色餐饮农家乐深度解析与优选推荐 - 品牌鉴赏官2026
  • 2026年泸州公职备考机构评测:泸州考公去哪里咨询靠谱/泸州考公没有备考方向怎么办/泸州导氮教育深度解析 - 优质品牌商家
  • 2026年 沈阳液态气体品牌推荐榜:工业级高纯氮氧氩,医用液态氧与特种气体供应商实力解析 - 品牌发掘
  • 客观题知识点总结
  • 数据的加密与解密(01:13)
  • 别再死记硬背!图解X86汇编三种寻址方式,用CTFshow PWN题彻底搞懂内存访问
  • 2026年防弹门窗厂家实测评测:核心指标客观对比 - 优质品牌商家
  • 2026年成都企业宣传片公司评测:五大核心维度对比 - 优质品牌商家
  • 苏州拍婚纱照哪家好?园林外景看这三个维度 - eee888
  • 数据的加密与解密(01:07)
  • 人脸超分训练工程包:含CelebA预处理脚本、ISR网络实现与GPU训练流程
  • 2026年 牛饲料厂家推荐排行榜:高蛋白育肥/抗病营养配方,专业品质与养殖增效优选! - 品牌发掘
  • 2026年食品厂净化工程推荐榜单:无尘车间/洁净厂房/空气净化系统,卫生达标与能耗优化的良心之选 - 品牌发掘
  • 2026年 吐鲁番建筑资质代办十大服务商推荐榜:专业高效与诚信口碑深度解析 - 品牌发掘
  • 深入解析NXP S12XE XGATE协处理器:架构、编程与双核调试实战
  • 广告代理商必备竞品投放分析工具盘点|2026-2027行业实战选型 - 短商
  • 探索Python在数据科学中的关键应用及未来趋势(15)
  • 2026年 休闲辽宁春节礼品礼盒推荐榜单:地道风味与精致年礼,传递新春温情与品质之选 - 品牌发掘
  • 2026年 外贸网站建设服务商最新推荐榜单:多语言独立站/B2B营销型官网/询盘转化与海外SEO优化公司深度测评 - 品牌发掘