使用Thead子类创建线程VS使用Thread直接创建线程(Runnable接口)的区别

一、两种写法代码示例

1. 继承 Thread 类

java

// 1. 继承Thread

class MyThread extends Thread {

    @Override

    public void run() {

        System.out.println("线程执行:" + Thread.currentThread().getName());

    }

}

// 使用

MyThread t1 = new MyThread();

t1.start(); // 启动线程

2. 实现 Runnable 接口

 java

// 1. 实现Runnable

class MyRunnable implements Runnable {

    @Override

    public void run() {

        System.out.println("线程执行:" + Thread.currentThread().getName());

    }

}

// 使用

MyRunnable run = new MyRunnable();

Thread t2 = new Thread(run);

t2.start();

 

二、核心区别

1. 继承限制(最关键)

- 继承 Thread:Java 是单继承,类一旦继承  Thread ,不能再继承其他父类,扩展性差。

- 实现 Runnable:只是实现接口,还可以正常继承别的类,灵活度高。

2. 资源共享

- 继承 Thread:每个对象都是独立线程,无法天然共享成员变量。

- 实现 Runnable:同一个 Runnable 对象可以传给多个 Thread,天然实现多线程共享资源(售票、计数场景首选)。

示例(共享票数):

java

// 共享资源场景,Runnable 优势明显

class Ticket implements Runnable {

    private int ticket = 10; // 共享变量

    @Override

    public void run() {

        while(ticket > 0) {       System.out.println(Thread.currentThread().getName() + " 卖票:" + ticket--);

        }

    }

}

// 同一个任务对象,多个线程执行,共享票数

Ticket task = new Ticket();

new Thread(task, "窗口1").start();

new Thread(task, "窗口2").start();

3. 职责分离

 - Thread:既是线程对象,又是任务,耦合度高。

- Runnable:任务(run)和线程(Thread)分离,符合面向对象设计。

 4. 代码复用 

- Runnable 任务可以反复交给不同线程、线程池执行,复用性更强。

 三、执行流程共同点

 1. 重写/实现 run():任务逻辑,不会主动开启新线程。

2. 调用 start():向 JVM 申请开启新线程,JVM 自动调用  run() 。

 误区:直接调用  run()  只是普通方法调用,不会创建新线程。

 四、使用场景&推荐

 1. 优先使用:实现 Runnable 接口

- 需要共享资源

- 类需要继承其他父类

- 配合线程池使用(线程池只接收 Runnable/Callable)

2. 偶尔使用:继承 Thread 类

- 简单独立线程、无需继承其他类、无需共享资源的简单场景。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值