推荐使用 Runnable 接口而非继承 Thread 类,因其突破单继承限制、实现任务与线程职责分离、支持线程池和 Lambda、共享状态更安全、且兼容现代并发 API。

推荐使用实现 Runnable 接口而不是继承 Thread 类,核心原因在于设计合理性、扩展性和实际协作需求——不是语法不能用,而是用 Runnable 更自然、更安全、更贴近真实开发场景。
Java 单继承限制直接封死继承 Thread 的路
一个类只能继承一个父类。如果你的业务类 already 继承了某个框架类(比如 Spring 的 Service、Android 的 Activity、或者自定义的 BaseProcessor),就无法再 extends Thread。而 Runnable 是接口,可以和任意继承链共存,还能同时实现多个接口(如 Serializable、AutoCloseable)。
任务与线程职责天然分离
继承 Thread 会让一个类既管“做什么”(run 逻辑),又管“怎么调度”(start/join/interrupt 等线程控制),违背单一职责。而 Runnable 只描述“要做的事”,Thread 或 ExecutorService 负责执行——这种解耦让任务可复用、可测试、可替换执行器。
- 同一个
Runnable实例能被多个Thread共享(适合卖票、计数等共享状态场景) - 能直接传给
Executors.newFixedThreadPool(5).submit(task),无缝接入线程池 - Lambda 写法简洁:
new Thread(() -> System.out.println("ok")).start();
资源共享更直观、更少出错
用 Thread 子类时,若想多个线程操作同一份数据,必须把变量声明为 static,容易引发静态变量生命周期过长、并发修改混乱等问题;而 Runnable 实例本身是对象,其成员变量天然被多个线程共享(只要传的是同一个实例),逻辑清晰,无需额外加 static 修饰。
立即学习“Java免费学习笔记(深入)”;
符合 Java 后续演进方向
从 ExecutorService 到 ForkJoinPool,再到 CompletableFuture,所有现代并发 API 都只接受 Runnable 或 Callable,不接受 Thread 子类。写 Runnable 是向前兼容的,写 Thread 子类等于把自己锁死在原始线程模型里。


















