第六章:多线程与并发
6.3 实现线程的方式(继承Thread、实现Runnable)
在Java中,实现多线程编程主要有两种方式:
- 继承
Thread类 - 实现
Runnable接口
1. 继承Thread类
通过继承Thread类并重写其run()方法,可以定义一个线程的具体执行逻辑。
示例代码
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行逻辑:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程
}
}
特点
- 优点:简单直接,适合快速实现线程逻辑。
- 缺点:由于Java是单继承,继承
Thread类后无法再继承其他类,灵活性较低。
2. 实现Runnable接口
通过实现Runnable接口并实现其run()方法,将任务逻辑与线程控制分离。
示例代码
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程执行逻辑:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程
}
}
特点
- 优点:
- 避免单继承限制,可同时实现其他接口或继承其他类。
- 更适合资源共享(如多个线程共享同一个
Runnable实例)。
- 缺点:需要额外创建
Thread对象来启动线程。
3. 两种方式的对比
| 对比项 | 继承Thread类 | 实现Runnable接口 |
|---|---|---|
| 继承限制 | 占用继承名额 | 无限制 |
| 资源共享 | 每个线程独立实例 | 可共享同一Runnable实例 |
| 代码复用性 | 较低 | 较高 |
| 推荐场景 | 简单、独立的线程任务 | 复杂、需资源共享的任务 |
4. 其他实现方式(补充)
Lambda表达式(Java 8+)
简化Runnable接口的实现:new Thread(() -> System.out.println("Lambda线程")).start();实现
Callable接口
支持返回值和异常抛出,需配合FutureTask或线程池使用(详见并发工具类章节)。
总结
- 优先选择实现
Runnable接口,提高代码灵活性和可扩展性。 - 继承
Thread类适用于快速原型开发或简单场景。 - 实际开发中,推荐结合线程池(如
ExecutorService)管理线程资源。
