0

0

在Java中如何使用ExecutorCompletionService收集异步结果

P粉602998670

P粉602998670

发布时间:2025-10-19 19:04:01

|

568人浏览过

|

来源于php中文网

原创

ExecutorCompletionService是Java中用于按任务完成顺序获取异步结果的工具,它封装ExecutorService并结合BlockingQueue,将已完成任务的Future放入队列,通过take()或poll()方法获取结果,适用于需优先处理先完成任务的场景,如竞态查询。使用时需创建线程池,提交Callable或Runnable任务,并循环获取结果,注意及时关闭线程池及处理异常。

在java中如何使用executorcompletionservice收集异步结果

在Java中,当需要提交多个异步任务并按完成顺序获取结果时,ExecutorCompletionService 是一个非常实用的工具。它结合了 ExecutorServiceBlockingQueue 的能力,能将已完成的任务结果自动放入队列中,让你可以及时处理最先完成的任务,而不需要等待所有任务结束。

什么是ExecutorCompletionService?

它是一个包装类,接收一个 ExecutorService 实例,并维护一个阻塞队列(通常是 LinkedBlockingQueue),用于存放已完成任务的 Future 对象。每当一个任务完成,其 Future 就会被放入该队列,调用者可以通过 take() 或 poll() 方法获取结果。

相比直接使用 ExecutorService.invokeAll() 等待全部完成,CompletionService 更适合需要“谁先完成就处理谁”的场景,比如竞态查询、批量请求中的快速响应等。

如何使用CompletionService提交任务并获取结果

下面是使用 CompletionService 的基本步骤:

立即学习Java免费学习笔记(深入)”;

  • 创建线程池(ExecutorService)
  • 构建 ExecutorCompletionService 实例,传入线程池
  • 通过 submit() 提交多个 Callable 或 Runnable 任务
  • 循环调用 take() 或 poll() 获取已完成任务的结果

示例代码:

import java.util.concurrent.*;

public class CompletionServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(4); // 创建CompletionService ExecutorCompletionService completionService = new ExecutorCompletionService<>(executor);

    // 提交5个任务
    for (int i = 1; i <= 5; i++) {
        final int taskId = i;
        completionService.submit(() -> {
            // 模拟耗时不同的任务
            long sleepTime = (long) (Math.random() * 3000);
            Thread.sleep(sleepTime);
            return "任务" + taskId + " 完成,耗时:" + sleepTime + "ms";
        });
    }

    // 按完成顺序获取结果
    for (int i = 0; i < 5; i++) {
        // take() 会阻塞直到有结果可用
        Future future = completionService.take();
        System.out.println(future.get()); // 输出已完成的任务结果
    }

    executor.shutdown();
}

}

输出示例(顺序不固定,取决于执行时间):

PictoGraphic
PictoGraphic

AI驱动的矢量插图库和插图生成平台

下载
任务3 完成,耗时:687ms
任务1 完成,耗时:923ms
任务5 完成,耗时:1102ms
任务2 完成,耗时:1988ms
任务4 完成,耗时:2501ms

take() 与 poll() 的区别

CompletionService 提供两种方式从队列中取结果:

  • take():阻塞方法,如果没有完成的任务,会一直等待直到有结果可用
  • poll():非阻塞或带超时的方法,可以设置等待时间,超时返回 null

例如,使用带超时的 poll:

Future future = completionService.poll(5, TimeUnit.SECONDS);
if (future != null) {
    System.out.println(future.get());
} else {
    System.out.println("在5秒内没有任务完成");
}

这在某些实时性要求高的场景中很有用。

适用场景与注意事项

CompletionService 特别适用于以下情况:

  • 多个独立任务执行时间差异大,希望尽快处理已完成的任务
  • 实现“搜索竞速”,比如向多个数据源发起请求,取第一个返回的结果
  • 需要流式处理任务结果,而不是批量等待

注意点:

  • 记得关闭线程池(shutdown),避免资源泄漏
  • 处理异常时,务必调用 future.get() 并捕获 ExecutionException
  • 如果任务数量不确定,可以用 while 循环配合 poll 判断是否还有任务

基本上就这些。使用 ExecutorCompletionService 能让异步结果的收集更高效、更灵活,特别适合关注响应速度而非执行顺序的并发场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

438

2024.03.01

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

94

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

503

2023.08.10

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

143

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

28

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

64

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

C# 教程
C# 教程

共94课时 | 7.8万人学习

Java 教程
Java 教程

共578课时 | 52.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号