展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 如何在 Java 中使用 ExecutorCompletionService 按照异步任务完成的先后顺序获取返回结果

如何在 Java 中使用 ExecutorCompletionService 按照异步任务完成的先后顺序获取返回结果

如何在 Ja va 中使用 ExecutorCompletionService 按照异步任务完成的先后顺序获取返回结果 处理异步任务时,你是否遇到过这样的困扰:提交了一堆任务,却只能按照提交顺序一个个等待结果,即便后面的任务先完成了也得干等着?这在处理网络请求或I/O操作时尤其低效。好在Ja va并

本文目录

    如何在 Ja va 中使用 ExecutorCompletionService 按照异步任务完成的先后顺序获取返回结果

    如何在 Ja va 中使用 ExecutorCompletionService 按照异步任务完成的先后顺序获取返回结果

    处理异步任务时,你是否遇到过这样的困扰:提交了一堆任务,却只能按照提交顺序一个个等待结果,即便后面的任务先完成了也得干等着?这在处理网络请求或I/O操作时尤其低效。好在Ja va并发包里藏着一个利器——ExecutorCompletionService。它能帮你按任务实际完成的先后顺序获取结果,真正做到“谁先做完,谁先汇报”。

    简单来说,它是对普通Executor的增强包装,核心秘诀在于内部用了一个BlockingQueue(默认是LinkedBlockingQueue)来暂存已完成的Future。这样一来,获取结果的顺序就与提交或执行的顺序脱钩了。

    ExecutorCompletionService 按任务实际完成先后顺序返回结果,其核心是用BlockingQueue暂存已完成Future,通过done回调自动入队,take()/poll()按完成顺序出队获取Future再调用get()得结果。

    核心原理:完成即入队,取即出队

    它的工作机制非常清晰,就像一个高效的流水线分拣系统:

    • 当你通过submit()提交一个Callable任务后,ExecutorCompletionService会将其交给底层的Executor去执行。
    • 与此同时,它会创建一个封装该任务的Future,并巧妙地注册一个内部监听机制(这通常依赖于FutureTask的done状态回调)。
    • 一旦任务执行完毕(无论是成功返回还是抛出异常),对应的Future就会被自动放入内部的阻塞队列中等待被领取。
    • 这时,你调用take()或poll()方法,就能按照任务完成的先后顺序,从队列中取出这些Future,之后再调用get()便能拿到最终的结果或异常。

    整个过程,实现了从“任务完成”到“结果可被消费”的无缝、有序衔接。

    基本使用步骤(带示例)

    光说不练假把式。假设我们有3个模拟的异步任务,它们的耗时各不相同(以此来模拟现实中网络或I/O操作的差异),我们的目标就是谁能干完活,就先处理谁的结果。

    (以下为关键代码逻辑,可直接运行)

    • 第一步:准备线程池。 例如,使用Executors.newFixedThreadPool(3)创建一个固定大小的线程池。
    • 第二步:包装成CompletionService。 用这个线程池作为参数,构造一个ExecutorCompletionService实例。
    • 第三步:提交任务。 循环提交你的Callable任务(比如,每个任务休眠随机时间后返回一条耗时信息)。
    • 第四步:按完成顺序获取。 关键来了!调用completionService.take()。这个方法会阻塞当前线程,直到有任何一个任务完成,然后立刻返回那个最先完成的Future。
    • 第五步:提取结果。 对返回的Future调用get()。由于这个Future对应的任务已经确定完成,此时调用get()会立即返回结果,不会发生阻塞。

    通过这五步,你就能轻松实现“结果先到先得”,极大提升了处理效率。

    处理异常与超时的注意事项

    现实世界不会总是一帆风顺,任务可能失败,我们也不想无限期等待。使用ExecutorCompletionService时,有几点需要特别留意:

    立即学习“Ja va免费学习笔记(深入)”;

    • 异常处理仍在。 从CompletionService取出的Future,调用其get()方法时,仍然可能抛出ExecutionException(它包装了任务执行时抛出的原始异常)或InterruptedException,因此必要的try-catch不可少。
    • 非阻塞与超时选项。 如果不想让take()一直阻塞,可以使用poll()方法(没有已完成任务则立即返回null),或者使用poll(long timeout, TimeUnit unit)来设置一个等待超时时间。
    • 分清Future和结果。 务必记住:take()和poll()返回的是Future对象,并不是最终的结果值。你必须再调用一次get(),才能拿到实际的计算结果或感知到执行异常。
    • 失败任务的处理。 如果某个任务执行失败,而你想忽略它继续处理其他已完成的任务,可以在调用get()时捕获ExecutionException,然后根据业务逻辑决定是跳过、记录还是重试。一个任务的失败不会阻塞队列,其他已完成的任务依然可以被正常取出。

    对比 Future 列表 + 循环 isDone() 的劣势

    在没有CompletionService之前,一个常见的替代方案是:将提交任务后得到的所有Future保存到一个列表里,然后写一个循环去不停地轮询每个Future的isDone()方法。

    这种方法存在几个明显的短板:效率低下(轮询本身消耗CPU)、响应不实时(从任务完成到被轮询发现存在延迟)、容易写出忙等待(busy-wait)代码,并且线程安全性需要额外小心。

    反观ExecutorCompletionService,它基于阻塞队列的“生产者-消费者”模型,天然实现了“完成即通知”的机制。消费线程在无任务时安心阻塞,有任务时立刻被唤醒,没有任何空转开销。同时,其内部封装保证了线程安全,使用语义也清晰直观——这就是专业工具带来的降维打击。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。