Java 多线程:继承 Thread 与实现 Runnable 两种创建方式完整对比

📅 2026/6/30 1:11:52
Java 多线程:继承 Thread 与实现 Runnable 两种创建方式完整对比
一、前言本文为 Java 多线程课程作业对比两种基础线程创建方式继承 Thread 子类、实现 Runnable 接口。分别给出完整可运行代码从代码结构、类继承限制、资源共享、扩展性等维度分析核心区别总结开发中推荐使用 Runnable 的原因。二、两种创建方式代码实现包名 com.javablog方式 1继承 Thread 类创建线程package com.javablog; // 自定义类继承Thread重写run方法 public class MyThread extends Thread { // 共享票数 private int ticket 10; Override public void run() { while (ticket 0) { System.out.println(Thread.currentThread().getName() 卖出第 ticket 张票); ticket--; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 创建多个线程对象每个对象拥有独立ticket变量 MyThread t1 new MyThread(); MyThread t2 new MyThread(); t1.setName(窗口1); t2.setName(窗口2); t1.start(); t2.start(); } }运行现象两个窗口各自售卖 10 张票总票数 20 张无法共享资源。方式 2实现 Runnable 接口创建线程package com.javablog; // 实现Runnable接口重写run方法 public class MyRunnable implements Runnable { // 共享票数所有线程共用这一个变量 private int ticket 10; Override public void run() { while (ticket 0) { System.out.println(Thread.currentThread().getName() 卖出第 ticket 张票); ticket--; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 只创建一份任务对象 MyRunnable task new MyRunnable(); // 多个Thread共用同一个任务共享ticket资源 Thread t1 new Thread(task, 窗口1); Thread t2 new Thread(task, 窗口2); t1.start(); t2.start(); } }运行现象两个窗口共同售卖 10 张票多线程共享同一份资源。三、核心区别对比对比维度继承 Thread 子类实现 Runnable 接口继承限制Java 是单继承继承 Thread 后无法再继承其他父类扩展性差仅实现接口不占用类继承名额可同时继承其他类扩展性强资源共享每个线程对象独立成员变量互不共享多线程操作同一资源需要静态变量多个 Thread 可共用同一个 Runnable 任务对象天然共享成员变量适合售票、抢单等场景职责分离线程对象与业务逻辑耦合在一起线程控制、业务代码写在同一个类解耦Thread 只负责线程调度Runnable 仅存放业务执行逻辑符合单一职责代码复用业务逻辑绑定线程类复用性弱任务可重复交给多个线程、线程池执行复用性高开发推荐度仅简单一次性测试场景使用项目、竞赛标准首选方案四、关键细节解析1.单继承限制最核心短板Java 不支持多类继承如果业务类已经继承其他父类就不能再继承 Thread而 Runnable 是接口一个类可以实现多个接口无继承冲突。2.资源共享差异原理继承 Thread每次new MyThread()都会新建对象成员变量是实例私有实现 Runnable只创建一个任务实例传入多个 Thread所有线程操作同一个对象的成员变量天然共享数据。3.解耦设计思想Thread 类是 JVM 提供的线程调度器负责开启、休眠、中断线程Runnable 只承载需要执行的业务代码将「线程调度」和「业务逻辑」分开代码更清晰。五、运行结果示例继承 Thread 输出不共享票实现 Runnable 输出共享票六、总结1.继承 Thread 类写法简单但受 Java 单继承限制无法共享实例资源扩展性差仅适合简单测试2.实现 Runnable 接口无继承限制、天然支持多线程资源共享、职责解耦、任务可复用是企业开发、竞赛通用标准写法3.实际开发中一律优先选择实现 Runnable 接口的方式创建线程。