继承 Thread 类 vs 实现 Runnable 接口创建线程区别

张开发
2026/6/10 19:57:21 15 分钟阅读

分享文章

继承 Thread 类 vs 实现 Runnable 接口创建线程区别
一、两种方式代码实现演示方式 1继承 Thread 类extends Thread//1.自定义类继承Thread重写run() class MyThread extends Thread{ Override public void run() { //线程执行任务 for(int i0;i5;i){ System.out.println(Thread.currentThread().getName()i); } } } //测试 public class ThreadTest{ public static void main(String[] args) { MyThread t1 new MyThread(); MyThread t2 new MyThread(); t1.start();//开启新线程 t2.start(); } }方式 2实现 Runnable 接口implements Runnable//1.任务类实现Runnable重写run() class MyRunnable implements Runnable{ Override public void run() { for(int i0;i5;i){ System.out.println(Thread.currentThread().getName()i); } } } //测试 public class RunnableTest{ public static void main(String[] args) { MyRunnable task new MyRunnable();//同一个任务对象 Thread t1 new Thread(task,线程A); Thread t2 new Thread(task,线程B); t1.start(); t2.start(); } }二、核心区别对比对比维度继承 Thread 类实现 Runnable 接口继承限制Java 单继承继承 Thread 后不能再继承其他父类扩展性差实现接口还可以继承别的类、实现多个接口规避单继承局限资源共享每个线程都是独立对象无法共用任务数据同一个 Runnable 实例可传入多个 Thread多线程共享任务资源适合卖票、计数场景任务与线程耦合任务代码绑定在线程类中线程和任务耦合在一起任务和线程分离Runnable 存业务任务Thread 只做线程调度解耦设计代码复用复用性差任务和线程绑定任务可复用被多个线程、线程池调用三、关键场景举例多线程共享资源卖票案例1. 继承 Thread无法共享票数每个对象独立数据class TicketThread extends Thread{ private int ticket10;//每个实例独立10张票 Override public void run(){ while(ticket0){ System.out.println(Thread.getName()出票ticket--); } } } //三个线程各自10张票总共卖出30张不符合需求 new TicketThread().start(); new TicketThread().start(); new TicketThread().start();2. 实现 Runnable共享同一份票数正确卖票class TicketRun implements Runnable{ private int ticket10;//唯一实例多线程共享 Override public void run(){ while(ticket0){ System.out.println(Thread.currentThread().getName()出票ticket--); } } } //同一个任务对象3个线程争抢10张票 TicketRun task new TicketRun(); new Thread(task,窗口1).start(); new Thread(task,窗口2).start(); new Thread(task,窗口3).start();四、选择1、优先选择实现 Runnable 接口规避 Java 单继承限制面向接口编程天然支持多线程共享数据适配线程池、任务调度任务与线程解耦符合单一职责。2、仅简单场景使用继承 Thread线程任务简单、不需要共享资源、无需拓展继承时代码书写快捷。

更多文章