Java 线程创建继承Thread子类 vs 直接new Thread到底有什么区别在 Java 多线程基础学习和面试中最经典的问题之一继承 Thread 类创建线程 和 直接 new Thread() 传入 Runnable 创建线程有什么本质区别很多同学只会写代码但说不清底层差异、设计缺陷、适用场景面试极易扣分。今天我用一篇博客彻底讲透两种写法的语法、原理、优缺点、资源共享、设计思想、企业最佳实践。一、两种线程创建方式代码还原1. 方式一自定义类继承 Thread 子类核心逻辑继承Thread类重写run()方法线程对象本身就是任务。// 自定义线程类继承Thread public class MyThread extends Thread { Override public void run() { // 线程执行的任务逻辑 for (int i 0; i 5; i) { System.out.println(线程执行 Thread.currentThread().getName() i i); } } } // 测试 public class ThreadTest { public static void main(String[] args) { MyThread t1 new MyThread(); MyThread t2 new MyThread(); t1.start(); t2.start(); } }特点线程对象和任务耦合在一起。2. 方式二直接 new Thread Runnable核心逻辑Thread只负责线程调度Runnable专门负责任务逻辑线程和任务解耦。public class RunnableTest { public static void main(String[] args) { // 定义独立任务 Runnable task () - { for (int i 0; i 5; i) { System.out.println(线程执行 Thread.currentThread().getName() i i); } }; // 多个线程共用同一个任务 Thread t1 new Thread(task); Thread t2 new Thread(task); t1.start(); t2.start(); } }二、核心区别对照表面试必背对比维度继承 Thread 子类new Thread Runnable设计思想继承is-a组合has-a耦合度高线程任务低线程、任务分离Java单继承限制有无法再继承其他类无可正常继承、多实现接口任务共享困难每个线程独立任务轻松多线程共享同一个Runnable代码复用性差高任务可复用、可交给线程池扩展性差强适配线程池、Callable开发推荐不推荐✅ 官方推荐三、深度原理讲解1. 继承 Thread 的最大缺陷单继承限制Java 是单继承机制如果你的类extends Thread就不能再继承其他业务父类。在业务开发中实体类、工具类、业务父类非常普遍一旦继承 Thread直接废掉类的扩展性。而Runnable是接口一个类可以继承一个父类同时实现多个接口完全不影响业务结构。2. 任务与线程是否解耦是核心差距继承 Thread 方式任务逻辑写在 Thread 子类内部任务属于线程任务不能单独剥离复用。Runnable 方式任务是独立的Runnable对象线程只是一个“执行者”。同一个任务可以被多个线程并行执行交给线程池执行随时替换、修改3. 资源共享场景面试高频需求三个线程同时卖 100 张票共享资源。✅Runnable 轻松实现共享class TicketTask implements Runnable{ private int ticket 100; Override public void run() { while (ticket 0) { System.out.println(Thread.currentThread().getName() 卖票 ticket--); } } } // 三个线程共享同一个任务对象 public class Test { public static void main(String[] args) { TicketTask task new TicketTask(); new Thread(task,窗口1).start(); new Thread(task,窗口2).start(); new Thread(task,窗口3).start(); } }❌继承 Thread 无法直接共享每 new 一次子类就是一个独立线程对象变量不共享必须加static静态变量强行共享代码丑陋且线程不安全。四、常见误区run() 和 start() 千万别混用两种创建方式通用规则start()调用 native 方法向操作系统申请开启新线程最终执行 run()真正多线程run()只是普通成员方法调用不开启新线程串行执行面试高频坑直接调用 run() 不会创建新线程五、企业开发最终结论✅ 永远推荐Thread RunnableLambda理由符合组合优于继承的设计思想规避单继承限制类结构更优雅任务与线程解耦复用性极强天然支持多线程资源共享无缝对接线程池、Future、异步任务❌ 禁止使用继承 Thread 子类除了教学演示实际项目中几乎没有使用场景。六、全文总结1. 继承 Thread 是继承耦合受单继承限制无法共享任务复用性差不推荐2. 直接 new Thread Runnable 是组合解耦线程和任务分离支持资源共享、高复用、易扩展3. 开发统一标准一律使用 Runnable / 线程池禁止继承 Thread4. 开启线程必须调用start()不能直接调用run()。看似简单的线程创建方式背后是 Java 优秀的设计思想组合优于继承、职责单一、解耦复用。掌握这两种方式的区别是学好多线程、搞定面试、写出高质量并发代码的基础。