继承Thread类 vs 实现Runnable接口:彻底讲透Java多线程的两种创建方式
从原理到实战,从卖票到竞赛题,一张表搞懂官方为什么推荐Runnable
📖 前言
Java多线程是面试高频考点,也是开发必备技能。而最基础的问题就是:到底用继承Thread类还是实现Runnable接口? 很多初学者背了答案却不懂本质。
本文手把手带你写代码、跑结果、做对比,并扩展竞赛题和创新应用。全文配有实操截图,看完你就再也不会选错了。
🧠 一、知识点速览(背下这张表)
| 对比维度 | 🧬 继承 Thread 类 |
🎯 实现 Runnable 接口 |
|---|---|---|
| 资源共享 | ❌ 多个线程对象各自独立,实例变量不共享 | ✅ 多个线程可共享同一个Runnable对象的实例变量 |
| 单继承限制 | 🚫 Java单继承,无法再继承其他类 | ✅ 可以继承其他类,更灵活 |
| 代码耦合 | 🔗 任务代码与线程控制代码耦合在一个类 | ✂️ 任务(Runnable)与线程(Thread)分离 |
| 线程池支持 | ❌ 不适合 | ✅ 原生支持(ExecutorService) |
| 使用场景 | 简单、独立、不共享数据的线程 | 多线程操作同一份数据(卖票、取钱、消息队列) |
| 官方推荐度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
💡 一句话结论:需要多个线程共享同一份资源 → 必须用
Runnable;即使不需要共享,为了规范性和扩展性,也默认用Runnable。
📋 二、作业原题回顾(含配图说明)
以下为老师布置的博客作业题目,本篇文章的所有实操截图将围绕该问题展开。
题目:
使用Thread子类创建线程 VS 使用Thread直接创建线程(Runnable接口)的区别?

🛠️ 三、手把手实操对比(附截图)
以下每个【截图X】处请插入你按照步骤运行后截取的图片。
3.1 方式一:继承Thread类(每个线程独立数据)
ExtendsThreadDemo.java 代码:
运行结果(示例输出):

🔍 现象:两个窗口各卖了3张票,总共6张。说明每个线程对象拥有自己独立的count副本。
3.2 方式二:实现Runnable接口(共享数据)
ImplementsRunnableDemo.java 代码:
运行结果(示例输出):
🔍 现象:两个窗口总共只卖了3张票,符合预期。count被两个线程共享。
3.3 对比实验:继承Thread的错误共享示范
ExtendsThreadBadShare.java 代码及运行结果:
运行结果(示例输出):

结果:同样各自卖3张票。如果强行用static修复,则所有实例共享一个变量,但会丧失灵活性且难以维护。
🏆 四、竞赛相关题目(蓝桥杯/力扣风格)
题目:交替打印 foo bar(力扣1115题变体)
要求:两个线程,一个打印“foo”,另一个打印“bar”,交替输出3次,最终结果为
foobarfoobarfoobar。必须使用Runnable接口 + 等待唤醒机制。
AlternatePrint.java 代码及运行结果:

💡 考点:
-
为什么用
while而不是if?(防止虚假唤醒) -
为什么锁对象用
PrintTask.class?(保证所有线程共用同一把锁) -
如果用继承
Thread实现,代码会复杂很多且难以复用。
🚀 五、创新点:用 Runnable 实现可暂停的下载任务
展示
Runnable的灵活性:通过volatile+wait/notify实现任务的暂停与恢复。这是继承Thread难以优雅做到的。
PauseableDownload.java 关键代码:

运行效果(显示“暂停下载” → 进度停止 → “恢复下载” → 继续):


🔍 创新价值:
-
任务逻辑(下载)与线程控制(暂停/恢复)完全分离。
-
可以轻松扩展为多个下载任务共享一个全局进度条。
-
线程池中提交的
Runnable同样可具备此能力。
📝 六、总结与最佳实践
场景 推荐方式 原因 多个线程操作同一份数据(卖票、计数器) ✅ Runnable天然共享资源 线程需要继承其他父类 ✅ Runnable避免单继承限制 需要使用线程池 ✅ Runnable/Callable线程池只接受 Runnable或Callable极简单的独立任务,且无需共享数据 ⚠️ 两者皆可,但仍建议 Runnable保持代码风格统一 🎯 阿里Java开发手册中也明确推荐: 线程资源必须通过线程池提供,而线程池提交的任务应优先使用
Runnable或Callable。
📚 七、参考文献
-
Java并发编程的艺术(书)
-
深入理解Java虚拟机:JVM高级特性与最佳实践
-
阿里巴巴Java开发手册(泰山版)
-
Java面向对象程序设计(第四版)
⭐ 八、写在最后
如果你觉得这篇文章对你有帮助,请点赞👍 + 收藏⭐ + 评论💬 支持一下!
你的鼓励是我持续输出硬核技术文章的动力。
更多推荐
所有评论(0)