Java实现多线程的常见方法
1. 继承 Thread 类
- 方式:创建子类继承 Thread 类,重写 run() 方法定义线程任务。
- 特点:
- 简单直接,可直接通过 start() 启动线程。
- 局限性:Java 单继承机制限制,子类无法再继承其他类。
2. 实现 Runnable 接口
- 方式:创建类实现 Runnable 接口,实现 run() 方法,将实例传入 Thread 构造器启动。
- 特点:
- 避免单继承限制,更灵活(可同时继承其他类或实现其他接口)。
- 适合多个线程共享同一任务逻辑(如资源同步场景)。
3. 实现 Callable 接口(JDK 1.5+)
- 方式:创建类实现 Callable<V> 接口,实现 call() 方法(可抛异常、带返回值),通过 FutureTask 包装后提交给线程执行。
- 特点:
- 支持返回值和异常处理,比 Runnable 功能更强大。
- 需配合 Future 或 ExecutorService 获取结果或管理线程。
4. 使用线程池(如 ExecutorService )
- 方式:通过 Executors 工具类创建线程池(如 FixedThreadPool / CachedThreadPool ),调用 execute() 或 submit() 提交任务( Runnable / Callable )。
- 特点:
- 重用线程,减少创建/销毁开销,提升性能。
- 统一管理线程生命周期,控制并发数量,避免资源耗尽。
- 适合大规模或重复执行的多线程任务。
核心区别
- Thread vs Runnable / Callable :前者是线程本身,后者是任务逻辑(分离“线程”与“任务”,更符合面向对象设计)。
- Runnable vs Callable :后者支持返回值和异常处理,适合需要结果的场景。
- 线程池优势:相比手动创建线程,线程池更高效、易维护,是实际开发中的首选方案。