本质区别在于继承thread将线程与任务耦合,而实现runnable分离任务逻辑与执行容器;前者受限于单继承且难以复用,后者支持多接口、资源共享自然、可无缝接入线程池与异步框架。

本质区别在于:继承 Thread 是把“线程”和“任务”绑在一个类里,而实现 Runnable 是把“任务”单独抽出来,交给线程去执行。
角色定位完全不同
Thread 类本身就是一个可运行的线程实体,继承它等于在定义一个“既是线程又是任务”的混合体;Runnable 接口则纯粹是任务契约——它不创建线程,只承诺提供一段可执行逻辑。JVM 启动线程时,Thread 的默认 run() 方法会检查是否传入了 Runnable 实例,有就调用它的 run(),没有才执行自身空实现。所以 Runnable 是任务的“内容”,Thread 才是执行的“容器”。
继承机制决定扩展能力
Java 只允许单继承,一旦选择 extends Thread,这个类就再也不能继承其他业务父类;而 implements Runnable 完全不受限制,既能继承已有类(比如 Service、Controller),又能同时实现多个接口(如 Serializable、Comparable)。企业项目中类通常已有明确继承关系,这时 Runnable 是唯一可行路径。
资源共享方式天然不同
继承 Thread 时,每个 new 出来的子类实例都是独立对象,成员变量互不干扰;实现 Runnable 时,多个 Thread 可共享同一个任务实例,其非静态成员变量就是天然的共享资源。例如卖票场景:Runnable 方式下 ticket-- 操作作用于同一变量,能真实模拟并发竞争;Thread 方式必须靠 static 才能共享,反而容易引发误用和线程安全混淆。
解耦程度影响复用与演进
Runnable 实现的任务类可以被 Thread 直接使用,也能被线程池(ExecutorService)提交,还能被 CompletableFuture 异步调用,甚至做单元测试时直接调用 run() 方法验证逻辑——完全脱离线程环境;而继承 Thread 的类一旦写成,就只能当线程用,无法单独测试或复用于异步框架,后期想迁移到线程池几乎要重写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











