继承Thread类启动开销略高(81ms vs Runnable的53ms),主要源于子类实例初始化;无法复用任务逻辑,导致冗余对象;static共享有竞态风险;单继承限制扩展性;Runnable更利于复用、测试与维护。

继承 Thread 类在处理简单任务时,启动开销略高,但对单次、轻量级任务影响不大;真正影响效率的不是创建方式本身,而是资源复用能力和线程生命周期管理。
启动耗时稍高,但差异有限
实测数据显示:纯继承 Thread 类创建并运行简单任务(如循环打印5次),平均耗时约81毫秒;而 Runnable 方式约为53毫秒。这多出的约28毫秒主要来自 Thread 子类实例的初始化开销——每个 Thread 子类对象都自带一套线程控制状态(如线程组、优先级、守护标志等),即使未用也需分配内存和初始化。
无法复用任务逻辑,易造成冗余对象
每次 new MyThread() 都生成一个全新线程+任务绑定体。若需多个线程执行相同逻辑(比如并发处理100个日志行),就得创建100个 MyThread 实例,每个都持有独立字段副本。而 Runnable 可复用同一 task 实例,减少堆内存占用和 GC 压力。
静态变量共享是权宜之计,非设计本意
想让多个继承 Thread 的实例共享数据(如票数、计数器),往往被迫把变量声明为 static。这虽能“共享”,但带来副作用:变量生命周期与类绑定,难以随业务范围释放;多处 static 修改易引发竞态,还需额外加锁。Runnable + 外部对象传入的方式更自然、可控。
立即学习“Java免费学习笔记(深入)”;
单继承限制拖慢长期维护
- 一旦继承 Thread,就不能再 extends 其他业务基类(比如 BaseTask、ConfigurableService)
- 若后续需要统一添加日志、监控、重试等横切逻辑,只能靠组合或反射绕过,代码变重
- 单元测试时,Thread 子类难 mock,而 Runnable 是纯接口,可轻松注入模拟实现
不复杂但容易忽略:对一次性、演示性或脚本类简单任务,继承 Thread 写起来快、读着直白;但只要涉及复用、扩展或协作,Runnable 就成了更可持续的选择。


















