使用 Callable + ExecutorService 创建线程的笔记

AI-摘要
LNotes-AI GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
使用 Callable + ExecutorService 创建线程的笔记
Liuxz一、核心组合的作用
Callable 是带返回值的任务接口,ExecutorService 是线程池管理接口,两者结合可实现 多线程并发执行带返回值的任务,兼具线程复用(线程池优势)和结果获取(Callable 优势)的特性。
二、关键组件
**
Callable<V>**:- 泛型接口,
V为返回值类型。 - 需重写
call()方法(任务执行体),支持返回结果和声明异常。
- 泛型接口,
**
ExecutorService**:- 线程池接口,负责管理线程生命周期和任务调度。
- 通过
submit(Callable<V>)方法提交任务,返回Future<V>对象。
**
Future<V>**:- 用于跟踪任务状态,获取
call()方法的返回值(get()方法),支持取消任务(cancel())。
- 用于跟踪任务状态,获取
三、使用步骤(代码示例)
示例 1:单任务提交与结果获取
1 | import java.util.concurrent.*; |
示例 2:多任务并发提交与批量获取结果
1 | import java.util.ArrayList; |
四、核心特点
- 带返回值的并发任务:相比
Runnable,Callable可通过Future.get()获取任务结果,满足需要异步计算并返回结果的场景(如多任务并行计算后汇总)。 - 线程复用:通过
ExecutorService线程池管理线程,避免频繁创建 / 销毁线程的性能开销。 - 异常处理:
call()方法声明的异常会被Future捕获,调用get()时需处理ExecutionException(包装任务异常)。 - 阻塞获取结果:
future.get()会阻塞当前线程,直到任务完成;也可通过future.isDone()先判断任务是否完成,避免不必要的阻塞。
五、注意事项
- 线程池关闭:任务执行完毕后必须调用
shutdown()关闭线程池,否则核心线程会一直存活,导致程序无法退出。 - 批量任务处理:使用
invokeAll(tasks)可批量提交任务,返回所有Future的列表,适合需要等待所有任务完成后汇总结果的场景。 - 任务取消:若需取消未执行的任务,可调用
future.cancel(true)(true表示中断正在执行的任务)。
六、总结
Callable + ExecutorService 是多线程并发处理带返回值任务的最佳实践:
Callable定义有返回值的任务逻辑;ExecutorService提供线程池管理,高效执行任务;Future跟踪任务状态并获取结果。
适用于并行计算、异步查询、多任务结果汇总等场景,兼顾性能与灵活性。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果




