线程两种方式

📅 2026/6/28 11:37:41
线程两种方式
Java创建线程两种方式对比继承Thread vs 实现Runnable前言Java多线程开发中创建线程最基础的两种写法一是继承 Thread 类自定义线程子类二是实现 Runnable 接口后传入 Thread 构造器。很多初学者分不清二者适用场景与底层差异本文从代码、设计、实战三个维度完整拆解区别。一、两种方式基础代码实现1. 继承Thread类方式核心逻辑自定义类继承 Thread 重写 run() 承载线程业务实例化子类直接调用 start() 启动线程。java// 自定义线程类继承Threadpublic class MyThread extends Thread {Overridepublic void run() {// 线程执行的业务逻辑for (int i 0; i 5; i) {System.out.println(继承Thread线程 i);}}public static void main(String[] args) {// 直接创建子类对象调用start开启线程MyThread thread new MyThread();thread.start();}}2. 实现Runnable接口方式核心逻辑单独定义任务类实现 Runnable 接口重写 run() 将任务实例传入 Thread 构造器再调用 start() 。java// 单独任务类实现Runnable接口public class MyTask implements Runnable {Overridepublic void run() {// 线程执行的业务逻辑for (int i 0; i 5; i) {System.out.println(实现Runnable线程 i);}}public static void main(String[] args) {// 先创建任务对象再交给Thread执行MyTask task new MyTask();new Thread(task).start();}}二、核心差异对比表对比维度 继承Thread类 实现Runnable接口继承限制 Java单继承约束继承Thread后无法再继承其他父类 无继承限制可同时继承父类、实现多个接口任务与线程耦合 线程对象、业务任务写在同一个类高度耦合 任务逻辑和线程调度分离职责解耦任务可复用多线程共享数据 多个线程对象数据独立共享需借助静态变量易出并发问题 多个Thread可共用同一个Runnable任务天然共享成员变量扩展性 扩展性差类结构受限 扩展性强符合面向接口编程思想主流使用场景 简单一次性独立线程、无数据共享需求 多线程处理同一业务、需要继承其他类、线程池开发推荐三、关键特性深度解析1. 单继承是最大短板Java语法规定一个类只能直接继承一个父类。如果业务类已经继承了其他业务父类就无法再使用 extends Thread 而 Runnable 是接口一个类可以同时实现多个接口不会破坏原有类的继承结构。2. 数据共享场景优劣卖票案例模拟多窗口卖同一份车票- 继承Thread必须把车票变量定义为 static 静态变量才能共享静态变量生命周期随类容易引发内存污染- 实现Runnable仅创建1个任务对象传入多个Thread所有线程共用任务内的成员变量天然实现数据共享并发控制更简洁。3. 底层执行本质一致两种方式最终都依赖 Thread.start() 方法向操作系统申请创建新线程 run() 只是普通业务方法直接调用 run() 不会开启新线程只有 start() 会触发操作系统线程调度。四、开发规范与选型建议1. 日常开发优先选择Runnable接口规避单继承缺陷、代码解耦、支持任务复用同时JDK线程池 ThreadPoolExecutor 、定时任务 ScheduledExecutorService 均统一接收 Runnable 任务是工业级标准写法。2. 仅简单独立线程可使用继承Thread适用于无继承需求、无共享数据、一次性执行的轻量线程场景代码行数更少写法简单。总结两种线程创建方式底层原理相同但在面向对象设计、代码复用、业务扩展性上差距明显。实现 Runnable 接口是更通用、更规范的开发方案继承 Thread 仅作为极简场景下的备选写法。