Future相关并发类使用

news/2025/10/1 18:57:59/文章来源:https://www.cnblogs.com/randolf/p/19122695

Future相关并发类使用

目录
  • Future相关并发类使用
    • 一、Callable&Future&FutureTask 详解
      • 1. 基础组件对比:Runnable vs Callable
      • 2. Future 接口:任务管理工具
      • 3. FutureTask:Runnable 与 Future 的结合体
      • 4. Future 的局限性
    • 二、CompletableFuture:Future 的扩展与增强
      • 1. 核心定位
      • 2. 异步任务创建:4 个静态方法
      • 3. 结果获取:join () vs get ()
      • 4. 核心功能:任务编排与结果处理
      • 5. 实战案例:烧水泡茶(对比 Future)
    • 关键问题
      • 问题 1:Future 相比 Runnable 有哪些核心优势?又存在哪些无法避免的局限性?
      • 问题 2:CompletableFuture 如何实现 “任务依赖关系” 的编排?请结合具体方法和案例说明。
      • 问题 3:在 “促销活动商品信息查询” 场景中,同步查询存在什么问题?使用 Future 改造的核心优势是什么?具体如何实现?

一、Callable&Future&FutureTask 详解

1. 基础组件对比:Runnable vs Callable

对比维度 Runnable 接口 Callable接口
返回值 无(run () 返回 void) 有(call () 返回 V 类型)
异常处理 不能抛出 checked Exception 可抛出 checked Exception(声明在 call () 方法)
函数式接口方法 void run() V call() throws Exception
配合组件 Thread(直接作为线程任务) Future/FutureTask(获结果)

2. Future 接口:任务管理工具

  • 核心 API 说明
    1. boolean cancel(boolean mayInterruptIfRunning):取消任务,参数指定是否立即中断运行中任务
    2. boolean isCancelled():判断任务是否在正常完成前被取消(是则返回 true)
    3. boolean isDone():判断任务是否完成(正常终止、异常、取消均返回 true)
    4. V get():阻塞等待任务完成,获 V 类型结果,抛 InterruptedException(线程被中断)、ExecutionException(任务执行异常)、CancellationException(任务被取消)
    5. V get(long timeout, TimeUnit unit):同上,增加超时时间,超时抛 TimeoutException
  • 本质:对 Runnable/Callable 任务的执行结果进行管理,但存在明显局限性。

3. FutureTask:Runnable 与 Future 的结合体

  • 特性:实现RunnableFuture接口(继承 Runnable 和 Future),既可以作为线程任务(Runnable)执行,也可以作为 Future 获取 Callable 的返回结果。
  • 使用流程
    1. 构建 Callable 实例;
    2. 将 Callable 实例传入 FutureTask 构造函数,创建 FutureTask 对象;
    3. 将 FutureTask 作为 Runnable 传入 Thread 或线程池执行;
    4. 通过 FutureTask 的 get () 方法获取任务结果。
  • 实战案例:促销商品信息查询
    • 同步查询问题:商品基本信息、价格、库存等 5 个接口各需 50ms,同步执行总耗时 200-300ms;
    • Future 改造方案:创建 5 个 FutureTask(分别对应 5 个查询任务),提交到线程池并行执行,总耗时约等于最长任务耗时(50ms);
    • 核心代码:通过ExecutorService提交 5 个 FutureTask,调用 get () 依次获取结果。

4. Future 的局限性

  1. 并发执行多任务时,仅能通过 get () 阻塞获取结果,无其他非阻塞等待方式;
  2. 无法对多个任务进行链式调用(如任务 A 完成后自动执行任务 B);
  3. 不能组合多个任务(如 10 个任务全部完成后执行后续操作);
  4. 无异常处理机制(接口未提供异常处理相关方法)。

二、CompletableFuture:Future 的扩展与增强

1. 核心定位

  • 实现 Future 接口,弥补 Future 的局限性,核心能力是任务编排(灵活组织任务的运行顺序、规则、方式),无需 CountDownLatch 等工具类的复杂逻辑。

2. 异步任务创建:4 个静态方法

方法签名 返回值 入参特点 线程池
runAsync(Runnable runnable) CompletableFuture 无返回值(Runnable) 默认 ForkJoinPool.commonPool ()
runAsync(Runnable runnable, Executor executor) CompletableFuture 无返回值,指定线程池 用户指定 Executor
supplyAsync(Supplier<U> supplier) CompletableFuture 有返回值(Supplier 的 get ()) 默认 ForkJoinPool.commonPool ()
supplyAsync(Supplier<U> supplier, Executor executor) CompletableFuture 有返回值,指定线程池 用户指定 Executor
  • 注意:默认线程池ForkJoinPool.commonPool()线程数默认等于 CPU 核数(可通过 JVM 参数-Djava.util.concurrent.ForkJoinPool.common.parallelism修改),建议按业务类型创建独立线程池避免线程饥饿。

3. 结果获取:join () vs get ()

方法 异常处理 使用场景
join() 抛 unchecked 异常(无需强制处理) 不想手动处理检查异常时
get() 抛 checked 异常(InterruptedException、ExecutionException,需 try-catch 或抛出) 需显式处理异常时(推荐)

4. 核心功能:任务编排与结果处理

功能分类 关键方法 作用说明 案例效果(部分)
结果处理 whenComplete() 任务完成 / 异常时执行 Action,处理结果或异常,返回原 CompletableFuture 结果 任务正常返回则打印 “执行完成”,异常则触发 exceptionally
exceptionally() 捕获任务异常,返回默认值 算术异常时返回 “异常 xxxx”
结果转换 thenApply() 接收上一任务结果,转换类型,返回同一 CompletableFuture 100→300(100*3)
thenCompose() 接收上一结果,返回新 CompletableFuture(展开内部 Future) 随机数 n→2n(新 CompletableFuture 计算)
结果消费 thenAccept() 消费单个结果,无返回值 随机数 8→打印 “40”(8*5)
thenRun() 不关心结果,任务完成后执行 Runnable 打印 “thenRun 执行”
thenAcceptBoth() 两个任务均完成,消费两者结果,无返回值 任务 1 返回 2、任务 2 返回 1→打印 “3”
结果组合 thenCombine() 合并两个任务结果,返回新结果 9+5=14(两个随机数相加)
任务交互 applyToEither() 取两个任务中先完成的结果,转换后返回 任务 1 耗时 6s、任务 2 耗时 5s→取 5 并 ×2
acceptEither 两个线程任务相比较,先获得执行结果的,就对该结果进行下一步的消费操作。
runAfterEither 两个线程任务相比较,有任何一个执行完成,就进行下一步操作,不关心运行结果
runAfterBoth() 两个任务均完成,执行 Runnable(不关心结果) 任务 1 睡 1s、任务 2 睡 2s→打印 “均完成”
allOf() 所有任务完成后返回(无返回值,需单独查每个任务结果) future1、future2 均完成→isDone () 均为 true
anyOf() 多个任务中任一完成,返回该任务结果 future1(睡 0-5s)、future2(睡 0-1s)→返回 “world”

5. 实战案例:烧水泡茶(对比 Future)

  • 需求:最优工序为 “洗水壶(1min)→烧开水(15min)” 与 “洗茶壶(1min)→洗茶杯(2min)→拿茶叶(1min)” 并行,烧开水和拿茶叶完成后泡茶。
  • Future 实现:需创建 T1Task(依赖 T2Task 的 FutureTask 获取茶叶)、T2Task,手动管理线程,代码较繁琐;
  • CompletableFuture 实现
    1. f1(runAsync):洗水壶→烧开水;
    2. f2(supplyAsync):洗茶壶→洗茶杯→拿茶叶(返回 “龙井”);
    3. f3(thenCombine):f1 和 f2 均完成后,执行泡茶逻辑,返回 “上茶:龙井”;
    4. 最终通过 f3.join () 获取结果,代码更简洁,任务依赖关系更清晰。

关键问题

问题 1:Future 相比 Runnable 有哪些核心优势?又存在哪些无法避免的局限性?

  • 答案

    优势:1.结果获取:Runnable 无返回值,Future 可通过 get () 方法获取 Callable 任务的执行结果;

    2.任务管理:Future 提供 cancel ()(取消任务)、isCancelled ()(查询是否取消)、isDone ()(查询是否完成)等 API,可实时掌握任务状态,而 Runnable 无此能力;

    3.异常间接处理:虽然 Future 无专门异常处理方法,但 get () 会抛出 ExecutionException(封装任务执行时的异常),可间接捕获任务异常,而 Runnable 的 run () 不能抛出 checked Exception。

    局限性:1.阻塞获取结果:仅能通过 get () 阻塞等待结果,无其他非阻塞方式;

    2.无链式 / 组合能力:无法实现 “任务 A 完成→自动执行任务 B” 的链式调用,也不能组合多个任务(如 10 个任务全部完成后执行后续操作);

    3.无异常处理机制:接口未提供专门的异常处理方法,需依赖 get () 的异常抛出间接处理,不够灵活。

问题 2:CompletableFuture 如何实现 “任务依赖关系” 的编排?请结合具体方法和案例说明。

  • 答案

    CompletableFuture 通过结果转换类方法实现任务依赖(前一任务结果作为后一任务入参),核心方法为thenApply()thenCompose(),具体如下:

    1. thenApply():接收上一任务的结果,通过 Function 转换类型,返回同一 CompletableFuture(适用于同步转换场景)。

      案例:异步任务 1 返回 100(supplyAsync (() -> 100)),通过 thenApply (number -> number * 3) 将结果转换为 300,最终 get () 获取 300,整个过程依赖同一 CompletableFuture。

    2. thenCompose():接收上一任务结果,返回新的 CompletableFuture(适用于异步转换场景,可展开内部 Future,避免嵌套)。

      案例:异步任务 1 生成随机数 n(supplyAsync (() -> new Random ().nextInt (30))),thenCompose (param -> CompletableFuture.supplyAsync (() -> param * 2)) 创建新 CompletableFuture 计算 2n,最终返回 2n 的结果,实现 “前一异步任务→后一异步任务” 的依赖。

问题 3:在 “促销活动商品信息查询” 场景中,同步查询存在什么问题?使用 Future 改造的核心优势是什么?具体如何实现?

  • 答案
    1. 同步查询问题:商品信息(基本信息、价格、库存、图片、销售状态)分布在不同系统,每个接口耗时约 50ms,同步查询需依次调用 5 个接口,总耗时 200-300ms,响应速度慢,影响用户体验。
    2. Future 改造的核心优势:将同步串行查询改为并行查询,总耗时约等于单个接口的最长耗时(约 50ms),大幅提升查询效率。
    3. 具体实现
      • 步骤 1:定义 5 个 Callable 任务(T1Task 查基本信息、T2Task 查价格、T3Task 查库存、T4Task 查图片、T5Task 查销售状态),每个任务 sleep 50ms 模拟接口耗时,返回查询结果;
      • 步骤 2:创建 5 个 FutureTask 对象,分别封装上述 Callable 任务;
      • 步骤 3:创建固定线程池(ExecutorService executorService = Executors.newFixedThreadPool (5)),提交 5 个 FutureTask 并行执行;
      • 步骤 4:通过 FutureTask 的 get () 方法获取每个任务的结果,最终汇总商品信息,总耗时约 50ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医药网站模板做网站哪家服务器好

在人工智能(AI)的浩瀚宇宙中&#xff0c;大模型以其强大的学习能力和广泛的适用性&#xff0c;正逐步成为推动技术进步和产业革新的核心动力。在这股浪潮中&#xff0c;通用大模型与垂直大模型如同两颗璀璨的星辰&#xff0c;各自散发着独特的光芒&#xff0c;共同照亮了AI发展…

东莞网站免费制作emlog to wordpress

文章目录 openssl3.2 - 测试程序的学习 - test\aesgcmtest.c概述笔记能学到的流程性内容END openssl3.2 - 测试程序的学习 - test\aesgcmtest.c 概述 openssl3.2 - 测试程序的学习 aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上…

2025 年传感器厂家 TOP 企业品牌推荐排行榜,磁致伸缩 / 防爆 / 防水 / 隔爆 / 线性 / 矿用 / 直线 / 油缸位移传感器 / 液位传感器公司推荐!

引言当前传感器行业发展迅速,市场上品牌与产品种类繁多,给企业和采购者带来了不小的选择难题。一方面,不同品牌的传感器在技术水平、产品质量、服务能力等方面存在较大差异,部分产品难以满足工业生产中对高精度、稳…

2025 年热转印花膜厂家 TOP 企业品牌推荐排行榜,硅胶 / 五金 / 塑胶 / ABS / 涂料桶 / PP / 水杯 / 温变 / 冰变热转印花膜加工厂推荐

引言在热转印行业蓬勃发展的当下,热转印花膜作为关键材料,其市场需求日益增长。然而,行业内却存在着诸多问题,让采购者面临不少困扰。一方面,部分厂家为追求利润,在生产过程中偷工减料,导致产品质量参差不齐,有…

2025 年生物除臭设备厂家 TOP 品牌企业推荐排行榜揭晓:印染厂污水 / 食品厂污水 / 污水处理厂 / 污水泵站 / 污水站 / 餐厨垃圾 / 屠宰场 / 厨余垃圾生物除臭设备公司推荐

引言随着环保意识的不断提升,各行业对臭气治理的需求日益迫切。污水处理厂、垃圾中转站、畜牧养殖场、食品加工厂等领域,因生产经营过程中产生的恶臭气体,不仅影响周边居民生活环境,还可能对工作人员的身体健康造成…

JUC:读写锁

无锁 => 独占锁 => 读写锁 => 邮戳锁 ReentrantLock, ReentrantReadWriteLock, StampedLock 4.12.1 面试题Java有哪些锁? 对于读写锁,锁饥饿问题是什么? 有没有比读写锁更快的锁?邮戳锁 StampedLock知道码…

2025 年舞台厂家 TOP 品牌企业权威推荐榜单,铝合金舞台、活动舞台、快装舞台、舞台架、折叠舞台、演出舞台、演唱会舞台桁架、舞台设计公司推荐

引言当前舞台行业发展迅速,各类演出、展览、庆典活动对舞台设备的需求日益增长,但行业内却存在诸多问题。许多舞台厂家缺乏完整的产业链,依赖外部采购原材料和配件,不仅难以把控产品质量,还容易受供应链波动影响,…

大连网站设计九即问仟亿科技在电脑上做二建题 哪个网站好

Hi,大家好我是tom,I am back.今天要给大家讲讲linux系统一些性能相关命令。 1.fdisk 磁盘管理 是一个强大的危险命令&#xff0c;所有涉及磁盘的操作都由该命令完成&#xff0c;包括&#xff1a;新增磁盘、增删改磁盘分区等。 1.fdisk -l 查看磁盘分区情况 Disk /dev/sda: 27.8…

2025 年点胶机厂家 TOP 企业推荐排行榜,自动 / 果冻胶 / 无痕内衣 / 烫钻 / 珠宝热熔胶 / 水钻热熔胶 / 亮片热熔胶 / 金葱粉热熔胶点胶机推荐这十家公司!

引言在当前的工业生产领域,点胶机作为重要的自动化设备,其性能与质量直接影响着生产效率和产品品质。然而,市场上点胶机源头厂家数量众多,产品种类繁杂,技术水平参差不齐,让不少企业在选购时陷入困境。部分厂家缺…

2025 年知识库应用工具系统平台推荐排行榜,企业 / 行业 / 专家 / 问答 / 智能 / 培训 / 协同 / 办公 / 内部 / 外部 / 个人 / 客服 / 营销知识库应用软件推荐!

引言在当今数字化飞速发展的时代,企业面临着海量信息的管理与利用难题。知识库应用成为了解决这一困境的关键手段,它能够帮助企业整合知识资源、提升员工工作效率、促进团队协作以及为决策提供有力支持。然而,市场上…

2025 年移民服务公司性价比排行:美国、加拿大等国 TOP 机构,综合费用与服务质量的考量!

在全球化浪潮的推动下,移民已成为众多家庭寻求新发展机遇、改善生活环境、为子女提供优质教育资源的重要途径。然而,移民市场的繁荣也伴随着诸多问题。目前,市场上移民公司数量众多、鱼龙混杂,服务质量参差不齐。部…

2025 年水泥墩公司推荐最新榜单白皮书发布,圆形 / 方形 / 光伏水泥墩 / 围挡水泥墩 / 护栏水泥墩 / 交通水泥墩 / 防撞水泥墩源头厂家推荐

引言水泥墩作为基础建材,在市政基建、光伏电站等领域应用广泛,需求旺盛。但行业厂家众多,产品质量参差不齐,让采购者难以抉择。 部分厂家为利润偷工减料,导致产品强度不足、耐久性差,难抵恶劣环境;一些厂家工艺…

实用指南:嵌入式硬件——I.MX6ULL EPIT(增强型周期中断定时器)

实用指南:嵌入式硬件——I.MX6ULL EPIT(增强型周期中断定时器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

2025 年乡墅平台 TOP 服务机构平台推荐排行榜 ,乡墅设计 / 品牌 / 加盟 / 农村自建房 / 建别墅 / 一站式建 / 湖南 / 长沙乡墅服务商推荐这十家公司!

在乡村振兴战略持续推进的当下,乡墅市场迎来了快速发展的契机,越来越多的城市精英选择回乡建造属于自己的理想居所。然而,当前乡墅行业却存在着诸多问题。市场上品牌众多,资质参差不齐,部分企业缺乏专业的设计团队…

2025 年美缝剂厂家 TOP 企业品牌推荐排行榜,深度剖析美缝剂公司实力与产品优势!

在如今的装修市场中,美缝剂作为提升瓷砖铺贴美观度和耐用性的重要材料,需求日益增长。然而,美缝剂行业却存在诸多问题,让消费者和合作方难以抉择。市场上产品质量参差不齐,部分厂家为追求利润,使用劣质原料生产,…

深入理解 Qt 元对象系统:QMetaEnum 的应用与实践 - 指南

深入理解 Qt 元对象系统:QMetaEnum 的应用与实践 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

2025 年褐藻寡糖厂家 TOP 企业品牌推荐排行榜,农业级 / 食品级 / G 型 / 化妆品级 / 饲料级 / 肥料用褐藻寡糖 / 褐藻寡糖钾盐 / 水剂 / 粉剂 / M 段公司推荐!

引言随着海洋生物产业的快速发展,褐藻寡糖凭借其在农肥、饲料、食品、化妆品及医药等多个领域的广泛应用前景,逐渐成为市场关注的焦点。然而,当前褐藻寡糖行业仍面临诸多问题,市场上品牌数量不断增多,但产品质量参…

2025换热器厂家最新推荐白皮书,不锈钢 / 钛 / 哈氏合金 / 碳钢 / 衬四氟 / 列管式 / 螺旋板 / 管壳式 / 缠绕式 / 复合材料换热器公司推荐!

在化工、环保、制药等众多行业的生产流程中,不锈钢、钛、哈氏合金、碳钢、衬四氟等不同材质,以及列管式、螺旋板、管壳式、缠绕式、复合材料等各类换热器,作为关键设备其性能与质量直接影响着生产效率、能源消耗以及…

网站建站中关键字搜索怎么弄万博法务网站

转载自 Java8-本地缓存这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值。非常完美的实现cache。来看下代码&#xff1a;12345678910111213141516publicstatic void main(String…

2025 年钢球厂家 TOP 企业品牌推荐排行榜,轴承 / 碳 / 精密 / 汽配 / 440C 不锈钢球 / 420 不锈钢球 / 304 不锈钢球 / 316L 不锈钢球制造商推荐这十家公司!

在钢球行业,随着市场需求的不断增长,各类钢球服务商如雨后春笋般涌现,但行业内也存在着诸多问题。产品质量参差不齐是突出问题之一,部分服务商为追求利润,在原材料选择和生产工艺上偷工减料,导致钢球精度不足、耐…