news 2026/6/10 17:46:00

使用Thread子类创建线程Vs使用Thread直接创建线程(Runnable接口)的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Thread子类创建线程Vs使用Thread直接创建线程(Runnable接口)的区别

核心区别一句话总结

“继承 Thread” 是单继承,代码简单但灵活性差;“实现 Runnable” 更灵活,适合多线程共享同一资源,也更符合面向接口编程。


详细对比表

对比项继承 Thread 类实现 Runnable 接口
资源共享无法直接共享(每个线程有自己的数据)多个线程可以共享同一个 Runnable 对象,轻松实现资源共享(如卖票系统)
单继承限制受限于 Java 单继承,不能再继承其他类无此限制,还可以继承其他类或实现多个接口
代码耦合度高(任务代码和线程控制耦合在一起)低(任务和线程分离)
创建方式new MyThread().start()new Thread(runnable).start()
适用场景简单、不需要继承其他类时大部分情况,尤其是需要灵活设计或线程池场景

代码示例说明

1. 继承 Thread 类(卖票问题演示缺陷)

java

class TicketThread extends Thread { private int tickets = 5; public void run() { while (tickets > 0) { System.out.println(getName() + " 卖票,剩余:" + --tickets); } } } // 使用 TicketThread t1 = new TicketThread(); TicketThread t2 = new TicketThread(); t1.start(); t2.start(); // 结果:每个线程各自卖出5张,总共卖出10张(错误❌)

2. 实现 Runnable 接口(正确共享)

java

class TicketRunnable implements Runnable { private int tickets = 5; public void run() { while (tickets > 0) { System.out.println(Thread.currentThread().getName() + " 卖票,剩余:" + --tickets); } } } // 使用 TicketRunnable task = new TicketRunnable(); Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); // 结果:两个线程共享5张票,总共卖出5张(正确✅)

底层与设计层面补充

  • Thread 本身也实现了 RunnableThread类的run()方法来自Runnable接口。

  • 线程池只能接受 Runnable 或 CallableExecutorService.submit(Runnable task)不支持直接提交Thread子类对象。

  • 推荐优先使用 Runnable:因为它更符合“组合优于继承”的设计原则。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:42:15

Glint:把碎片信息真正变成你的 Obsidian 知识库

Glint:把碎片信息真正变成你的 Obsidian 知识库 Glint 仓库地址:https://github.com/cjpnice/obsidian-glint 入驻了爱发电,喜欢的欢迎给我打赏一杯咖啡:https://ifdian.net/a/glint 你可能也遇到过这些问题 手机上看到好内容&am…

作者头像 李华
网站建设 2026/6/10 17:40:18

数字孪生与 Agent Harness 的协同仿真

数字孪生与 Agent Harness 的协同仿真:构建智能决策闭环的终极武器 摘要/引言 2024年4月,德国宝马集团宣布其全新的“BMW iFACTORY 2.0”架构在全球10家工厂同步落地,其中最引人注目的变革是将工厂级数字孪生(Digital Twin, DT)与基于Agent Harness的多智能体(Multi-Age…

作者头像 李华
网站建设 2026/6/10 17:39:31

MonkeyCode 开源社区的运营实战:如何用透明度赢得开发者信任

MonkeyCode 开源社区的运营实战:如何用透明度赢得开发者信任开源项目不只是把代码扔到GitHub上。真正的开源社区需要持续运营、透明沟通和真诚互动。MonkeyCode 作为一个国产开源AI编程平台,在社区运营上积累了不少实战经验。为什么社区运营对开源项目至…

作者头像 李华
网站建设 2026/6/10 17:36:33

爽WiFi产品拆解:一个香港WiFi蛋品牌的服务设计逻辑|选型参考

本文是对爽WiFi这个品牌的服务设计逻辑的拆解分析,不是广告,也不是简单的好评分享。写这篇文章的出发点,是试图从产品设计和服务架构的角度,分析爽WiFi在香港出境WiFi蛋市场建立口碑的原因——哪些设计是真正解决问题的&#xff0…

作者头像 李华