一、两种创建线程的方式回顾

// 方式1:继承Thread类
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程执行中...");
    }
}
// 启动线程
new MyThread().start();

// 方式2:实现Runnable接口
class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("任务执行中...");
    }
}
// 启动线程
new Thread(new MyTask()).start();

二、核心区别分析

  1. 继承与实现的限制
    继承Thread:Java是单继承,一旦继承了Thread就无法再继承其他类,扩展性受限。
    实现Runnable:可以继续继承其他类,也可以实现多个接口,更加灵活。

  2. 任务与线程的耦合度
    继承Thread:任务和线程绑定在同一个类中,耦合度高,不利于任务复用。
    实现Runnable:任务(Runnable)和线程(Thread)分离,同一个任务可以传给多个线程执行,也可以交给线程池。

  3. 资源共享能力


// Runnable方式:多个线程共享同一个任务对象
MyTask task = new MyTask();
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();  // t1和t2共享task中的实例变量

// Thread子类方式:每个线程有自己的独立实例,共享需要借助static变量
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();  // 各自独立,不共享

更多推荐