优先选实现 runnable 接口,因java单继承限制使已有父类时无法继承thread;runnable支持多实现、解耦任务与线程、便于共享资源、单元测试及线程池迁移,仅极少数需直接操作线程状态时才考虑继承thread。

优先选实现 Runnable 接口。这不是习惯问题,而是设计合理性与工程实践的必然选择。
类继承结构是否受限
Java 只支持单继承。如果你的业务类 already 继承了某个父类(比如 ServiceBase、AbstractAction 或自定义的领域模型),就无法再继承 Thread。而接口可以多实现,Runnable 不影响原有继承体系。
- 已有父类 → 必须用 Runnable
- 纯新类且无扩展需求 → 两种都可,但 Runnable 更规范
任务和线程是否需要解耦
继承 Thread 时,任务逻辑和线程对象绑死在一个类里:每个 new MyThread() 都是独立实例,成员变量互不干扰。想让多个线程共享同一份数据(比如卖票系统中 3 个窗口共卖 10 张票),就得把变量改成 static,容易引发线程安全问题,也违背面向对象封装原则。
- Runnable 实例可被多个 Thread 共享,天然支持资源共享
- 任务逻辑独立,便于单元测试、复用、替换执行器(如交给线程池)
是否考虑后续扩展性
真实项目几乎不会直接用 new Thread().start()。更常见的是把任务提交给 ExecutorService。而 Executor.submit() 接收的参数类型是 Runnable 或 Callable,不是 Thread 子类。
- 用 Runnable 编写的任务,可无缝迁移到线程池
- 继承 Thread 的代码,后期重构成本高,往往要重写任务部分
是否涉及线程控制细节
极少数场景需要直接操作线程生命周期或状态(比如调用 interrupt()、join()、isAlive()),且希望在任务类内部直接访问这些方法。此时继承 Thread 确实省一行 Thread.currentThread()。
- 这种需求极少,通常说明设计有偏差
- 即使需要,也可通过构造参数传入 Thread 引用,不必强耦合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











