方式 1:继承 Thread 子类创建线程
Java 中类是单继承,自定义类直接继承Thread,重写run()方法,实例化对象后调用start()启动线程。
// 1.自定义线程类,继承Thread class MyThread extends Thread { // 重写线程执行逻辑run方法 @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("继承Thread线程执行:" + i); } } } public class ThreadDemo { public static void main(String[] args) { // 创建线程对象 MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); // 启动线程,自动调用run() t1.start(); t2.start(); } }方式 2:实现 Runnable 接口创建线程
自定义类实现Runnable接口,重写run(),将实现类实例传入Thread构造器,通过 Thread 对象启动线程。
// 1.实现Runnable接口 class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("实现Runnable线程执行:" + i); } } } public class RunnableDemo { public static void main(String[] args) { // 创建任务对象 MyRunnable task = new MyRunnable(); // 同一个任务传入多个Thread,实现资源共享 Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); } }继承 Thread vs 实现 Runnable 核心区别对比
1. 继承关系限制(最大差异)
1.继承 Thread 类
Java 为单继承机制,一旦自定义类继承Thread,该类无法再继承其他父类,扩展性受限。
2.实现 Runnable 接口
接口支持多实现,自定义类实现Runnable后,依然可以继承其他父类,无继承限制,代码扩展性更强。
2. 资源共享能力
1.继承 Thread
每个Thread子类对象都是独立线程,各自拥有独立成员变量,无法共享资源。
示例:卖票场景,两个线程各持有一份票数,会重复卖出全部票数。
2.实现 Runnable
多个Thread对象可以传入同一个 Runnable 任务实例,所有线程共用任务对象的成员变量,天然支持多线程资源共享,适合售票、计数器等并发场景。
3. 代码结构对比表
| 对比维度 | 继承 Thread 类 | 实现 Runnable 接口 |
|---|---|---|
| 继承规则 | 单继承,无法再继承其他类 | 接口多实现,无继承限制 |
| 资源共享 | 不支持,每个对象独立资源 | 支持,多线程共用同一个任务 |
| 耦合度 | 高,线程与业务逻辑绑定 | 低,任务与线程调度分离 |
| 适用场景 | 简单独立线程,无需共享资源 | 多线程并发、资源共享、线程池开发 |
| 扩展性 | 差,受单继承约束 | 优秀,推荐企业开发使用 |