本质联系:Thread类本身也实现了Runnable接口,两种方式最终都是通过Thread对象的start()方法启动线程,调用run()方法执行任务。
推荐实践:优先使用实现Runnable接口的方式,因为它突破了 Java 单继承的限制,更灵活,也更符合面向对象的 “组合优于继承” 设计原则。
扩展方式:JDK 1.5 之后还可以使用Callable接口 + 线程池的方式创建线程,支持返回值和异常处理,功能更强大。
| 对比维度 | 继承Thread类 | 实现Runnable接口 |
|---|---|---|
| 继承限制 | 受 Java 单继承限制,无法再继承其他类 | 无单继承限制,可同时继承其他类、实现多个接口 |
| 资源共享 | 每个线程对象独立,无法直接共享同一个线程任务(需额外处理) | 多个Thread对象可共享同一个Runnable实例,天然支持多线程资源共享 |
| 耦合度 | 线程代码与线程对象强绑定,耦合度高 | 线程任务与线程对象分离,耦合度低,更符合面向对象设计 |
| 代码复用性 | 任务代码与线程类绑定,复用性差 | 任务代码独立为Runnable实现类,可被多个线程复用 |
| 适用场景 | 简单、独立的线程任务,无需共享资源 | 多线程共享资源、需要继承其他类、复杂业务场景 |