在 Java 多线程入门学习中继承 Thread 类、实现 Runnable 接口是两种最基础的线程创建方式日常开发经常用到很多初学者分不清两者区别与使用场景本文从代码、继承特性、资源共享、设计思想几个方面对比梳理。一、两种方式代码示例1、继承 Thread 类创建线程自定义类继承 Thread重写 run () 方法实例化对象调用 start () 启动线程。java运行class MyThread extends Thread { Override public void run() { for (int i 0; i 5; i) { System.out.println(getName() i); } } } public class Test { public static void main(String[] args) { MyThread t new MyThread(); t.setName(线程1); t.start(); } }2、实现 Runnable 接口创建线程自定义类实现 Runnable 接口重写 run ()将任务对象传入 Thread 构造方法调用 start () 开启线程。java运行class MyTask implements Runnable { Override public void run() { for (int i 0; i 5; i) { System.out.println(Thread.currentThread().getName() i); } } } public class Test { public static void main(String[] args) { MyTask task new MyTask(); Thread t1 new Thread(task, 线程A); Thread t2 new Thread(task, 线程B); t1.start(); t2.start(); } }二、核心区别继承限制 继承 ThreadJava 单继承机制继承 Thread 后无法再继承其他父类类拓展性差。 实现 Runnable接口可以多实现实现 Runnable 之后类还能继承其他父类、实现其他接口没有单继承约束。资源共享 继承 Thread每次 new 子类都是独立对象成员变量各自独立很难实现多线程共用同一份数据。 实现 Runnable多个 Thread 线程可以共用同一个 Runnable 任务对象天然支持多线程资源共享适合售票、抢资源等场景。设计职责 继承 Thread线程对象和业务任务耦合在同一个类中违背单一职责原则Thread 既负责线程调度又承载任务。 实现 Runnable任务和线程解耦Runnable 只封装业务逻辑Thread 只负责创建、启动线程代码分层清晰。三、使用场景总结优先选择实现 Runnable需要共享资源、已有父类要继承、配合线程池开发线程池接收参数为 Runnable企业项目绝大多数场景使用。选用继承 Thread任务简单独立、不需要数据共享、小型简易测试代码。补充知识点Thread 类底层本身实现了 Runnable 接口两种方式最终都是重写 run () 存放线程任务。start () 方法用来向操作系统申请创建新线程自动执行 run ()直接调用 run () 只是普通方法调用不会开启新线程。JDK8 及以上可以用 Lambda 表达式简写 Runnable简化代码书写new Thread (()- System.out.println (线程任务)).start ();