1. 继承 Thread 类方式

// 自定义类继承Thread
public class MyThread extends Thread {
    // 重写run(),编写线程执行逻辑
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        // 创建线程对象
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        // 启动线程
        t1.start();
        t2.start();
    }
}

2. 实现 Runnable 接口方式

// 实现Runnable接口,封装任务
public class MyTask implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        // 同一个任务对象
        MyTask task = new MyTask();
        // 多个线程共用同一个任务
        Thread t1 = new Thread(task, "线程1");
        Thread t2 = new Thread(task, "线程2");
        t1.start();
        t2.start();
    }
}

二、核心区别

    继承限制
    Thread:Java 单继承,继承后不能再继承其他类;
    Runnable:接口多实现,不占用继承名额,拓展性好。
    资源共享
    Thread:每个线程是独立对象,共享数据要加 static;
    Runnable:同一个任务对象可传给多个 Thread,天然共享成员变量,适合售票等并发场景。
    职责与复用
    Thread:线程管理、业务代码耦合在一起;
    Runnable:任务和线程分离,任务可复用,适配线程池,企业开发主流。

三、总结
日常开发优先实现 Runnable;仅简单测试用继承 Thread。

更多推荐