题目
Java中创建线程的两种主要方式及其区别
信息
- 类型:问答
- 难度:⭐
考点
线程创建方式,Thread类与Runnable接口,线程执行原理
快速回答
Java创建线程的两种主要方式:
- 继承Thread类:重写run()方法,直接调用start()启动线程
- 实现Runnable接口:实现run()方法,将实例作为参数传递给Thread对象
核心区别:
- 实现Runnable接口更灵活,避免单继承限制
- 实现Runnable接口更利于资源共享
- 实现Runnable接口符合面向对象设计原则
一、两种创建方式详解
1. 继承Thread类
原理说明:通过继承Thread类并重写run()方法定义线程执行逻辑,调用start()方法启动新线程(JVM会调用run())。
// 继承Thread类示例
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行: " + Thread.currentThread().getName());
}
}
// 启动线程
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动新线程
}
}2. 实现Runnable接口
原理说明:实现Runnable接口的run()方法,将实例作为target传递给Thread对象,由Thread控制线程生命周期。
// 实现Runnable接口示例
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行: " + Thread.currentThread().getName());
}
}
// 启动线程
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动新线程
}
}二、核心区别对比
| 对比维度 | 继承Thread类 | 实现Runnable接口 |
|---|---|---|
| 继承限制 | 占用唯一继承位(Java单继承) | 不占用继承位,可实现多个接口 |
| 资源共享 | 多个线程需创建独立实例 | 同一Runnable实例可被多个线程共享 |
| 代码结构 | 线程与任务逻辑强耦合 | 线程控制与任务逻辑解耦 |
| 扩展性 | 扩展性差(无法继承其他类) | 扩展性强(可通过Lambda简化) |
三、最佳实践
- 优先选择Runnable接口:
- 避免继承限制,保持代码灵活性
- 便于线程池等高级功能管理任务
- 可使用Lambda表达式简化代码:
new Thread(() -> System.out.println("Lambda线程")).start();
- Thread类适用场景:
- 需要重写Thread类特定方法(如设置线程优先级)
- 简单临时线程任务(不推荐生产环境使用)
四、常见错误
- 错误1:直接调用run()而非start()
- 结果:在当前线程同步执行,不会启动新线程
- 错误2:多个线程共享Thread实例
MyThread sharedThread = new MyThread(); new Thread(sharedThread).start(); // 错误!应传递Runnable实例 new Thread(sharedThread).start(); - 错误3:混淆线程对象和任务对象
- 正确:Thread是线程控制器,Runnable是任务定义
五、扩展知识
- Java 8+推荐方式:
- 使用ExecutorService线程池管理线程
- 通过Callable接口获取线程返回值
- CompletableFuture实现异步编程
- 线程执行流程:
- 调用start() → JVM创建新线程
- 新线程进入就绪状态(Runnable)
- 线程调度器分配CPU时间片
- 执行run()方法体
- 线程终止进入TERMINATED状态