Java 两种创建线程方式对比 Java 创建线程继承 Thread 类 vs 实现 Runnable 接口核心区别详解一、前言在 Java 多线程开发中最基础的两种线程创建方式分别是继承 Thread 子类、实现 Runnable 接口并传入 Thread。很多初学者刚接触多线程时会疑惑两种写法该如何选择本文从底层原理、代码示例、优缺点、适用场景全方位对比两者差异。二、两种方式代码实现演示**方式 1**继承 Thread 类重写 run ()Java 中Thread类本身就是线程载体自定义类继承Thread后重写run()方法编写线程任务逻辑直接new 子类对象().start()启动线程。// 继承Thread子类classMyThreadextendsThread{Overridepublicvoidrun(){// 线程执行任务for(inti0;i5;i){System.out.println(继承Thread线程i);}}}publicclassTestThread{publicstaticvoidmain(String[]args){MyThreadt1newMyThread();t1.start();// 开启新线程}}**方式 2**实现 Runnable 接口传入 Thread 构造器Runnable是任务接口仅提供run()抽象方法专门存放业务逻辑真正的线程对象依然是Thread将 Runnable 实现类作为参数传入 Thread 构造器调用 start () 启动。// 实现Runnable接口classMyTaskimplementsRunnable{Overridepublicvoidrun(){// 线程执行任务for(inti0;i5;i){System.out.println(实现Runnable线程i);}}}publicclassTestRunnable{publicstaticvoidmain(String[]args){MyTasktasknewMyTask();// 同一个任务对象可以交给多个线程执行Threadt1newThread(task);Threadt2newThread(task);t1.start();t2.start();}}三、核心区别对比类继承限制最大差异继承 Thread 类Java 是单继承一旦自定义类继承Thread就无法再继承其他父类扩展性被锁死。实现 Runnable 接口接口支持多实现实现Runnable后类还能继承其他父类、实现其他接口无继承限制更符合面向对象拓展设计。资源共享能力继承 Thread每次创建线程都要 new 全新的子类对象对象独立天然无法共享任务资源若要共享变量需要借助静态变量代码耦合高。实现 Runnable任务与线程分离同一个 Runnable 任务实例可以传入多个 Thread 对象多个线程天然共享任务内的成员变量适合多线程并发处理同一资源如售票、抢单场景。职责分层设计Thread 子类线程载体 业务任务耦合在同一个类中职责混乱不符合单一职责原则。类既负责操作系统线程调度又存放业务代码。Runnable 接口职责拆分清晰。Thread只负责线程调度、状态管理Runnable只负责承载业务执行逻辑解耦性更强。底层本质Thread类源码内部本身就实现了Runnable接口。继承 Thread 重写 run直接重写 Thread 自带的 run 方法传入 RunnableThread 内部会持有 Runnable 引用执行时调用传入任务的 run 方法。两种方式最终都是调用 JVM 本地方法创建操作系统线程底层调度逻辑无区别。代码复用性Thread 子类线程和任务绑定任务无法脱离线程复用Runnable任务是独立对象可以复用给线程池、定时器、多组线程复用性极高。四、优缺点总结继承 Thread 类✅ 优点代码简洁单一线程简单场景写起来更直观❌ 缺点单继承限制、无法多线程共享任务资源、职责耦合、复用性差实现 Runnable 接口✅ 优点无单继承限制、多线程共享资源、任务与线程解耦、复用性强、适配线程池❌ 缺点代码稍多一层封装新手初期理解门槛略高五、实际开发选型建议优先选择实现 Runnable 接口企业开发、并发任务、线程池场景统一使用该方案是行业标准写法仅简单测试、无拓展需求时可以临时使用继承 Thread 快速写 demo高并发共享资源场景多线程操作同一数据必须使用 Runnable 实现类。六、总结两种方式底层都是创建操作系统线程核心差距集中在类继承约束、资源共享、代码解耦三点。Runnable基于接口的设计完美规避了单继承缺陷职责分离的设计更贴合工程化开发因此日常开发中是首选方案。理解两者差异也是掌握 Java 多线程基础、学习线程池的前置知识点。