如何从ExecutorService中获取指定时间点前已完成任务的结果
Java线程池获取已完成任务结果实现方案
核心实现逻辑
- 提交任务时,将
ExecutorService.submit()返回的Future<Integer>对象统一存入列表,用于后续状态判断和结果读取 - 主线程完成其他耗时操作后,遍历存储的Future列表,调用
isDone()方法判断任务是否已结束(该方法对正常完成、执行异常、被取消的任务均会返回true) - 仅对已完成的任务调用
get()获取返回值,存入结果列表,未完成的任务直接跳过 - 最终调用
shutdownNow()终止所有未执行完成的线程
完整代码示例
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Main { public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(16); // 存储所有任务返回的Future对象 List<Future<Integer>> futureList = new ArrayList<>(); // 你的任务类需实现Callable<Integer>接口,返回值为Integer类型,此处为模拟任务实现 Callable<Integer> threadClass = () -> { // 模拟5秒耗时任务 Thread.sleep(5000); return 1; }; for(int i = 0 ; i < 100 ; i++) { Future<Integer> future = service.submit(threadClass); futureList.add(future); } // 主线程在此处执行其他耗时操作,此处仅作模拟 try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } // 收集已完成任务的结果 List<Integer> resultList = new ArrayList<>(); for (Future<Integer> future : futureList) { // 仅处理已完成的任务 if (future.isDone()) { try { resultList.add(future.get()); } catch (Exception e) { // 捕获任务执行异常、中断异常等,可根据业务需求调整处理逻辑 e.printStackTrace(); } } } // 可自行验证结果 System.out.println("已完成任务数量:" + resultList.size()); service.shutdownNow(); // 终止其余所有线程 } }
注意事项
- 若任务提交的是
Runnable类型无返回值的实现,需要调整Future的泛型参数,或在提交时指定返回值 - 若不需要处理任务执行异常的场景,可简化异常捕获逻辑
shutdownNow()会尝试终止所有正在执行的任务,停止处理等待队列中的任务,并返回等待执行的任务列表,可根据需求接收返回值做后续处理
内容的提问来源于stack exchange,提问作者Vedant Mehra
相关产品推荐
相关产品推荐

