当前位置: 首页 > news >正文

JUC 之 CompletableFuture

——CompletableFuture

Future

  • Future 接口(FutureTask 实现类) 定义了操作异步任务执行的一些方法,如获取异步的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕
  • 例如: 主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,忙其他事情或者先执行完,过了一会才去获取子任务的执行结果或变更的任务状态
  • Future 接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务
  • Future 是 Java5 新加的一个接口,提供了一种异步并行计算的功能。如果主线程需要执行一个很耗时的计算任务,就可以通过 Future 把这个任务放到异步线程中执行。主线程继续处理其他任务或者先行结束,再通过 Future 获取计算结果
  • 异步多线程任务执行且返回有结果(特点:多线程、有返回、异步任务)

优点

  • Future + 线程池异步多线程任务配合,能显著提高程序的执行效率

缺点

  • futureTask.get() 容易导致阻塞,一般建议放在程序后面,一旦调用,非要等到结果才会离开,不管你是否计算完成;假如不愿意等待很长时间,规定时间内自动离开,futureTask.get(3, TimeUnit.SECENDS)
  • isDone()轮询的方式会耗费无畏的CPU资源,而且也不见得能及时地得到计算结果;如果想要异步获取结果,通常都会以轮询的方式获取结果,尽量不要阻塞

问题 / 改进

  • 简单的业务场景使用 Future 完全 OK
  • 通过轮询的方式去判断任务是否完成,非常占 CPU 并且代码也不优雅
  • 假设业务需求,想将多个异步任务的计算结果组合起来,后一个异步任务的计算结果需要前一个异步任务的值;将两个或多个异步计算合成一个异步计算,这几个异步计算互相独立,同时后面这个又依赖前一个处理的结果
  • 当 Future 集合中某个任务最快结束时,返回第一名处理结果
  • 至此引出 CompletableFuture,以声明式的方式优雅处理这些需求,Future 能干的,CompletableFuture 都能干

CompletableFuture 概念

为什么会出现

  • 对于真正的异步处理,我们希望是可以通过传入回调函数,在Future结束时自动调用该函数,这样就不用等待结果
  • 阻塞的方式和异步编程的设计理念互相违背,而轮询的方式会耗费无畏的 CPU 资源
  • CompletableFuture 提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方

是什么

  • 在 Java 8 中,CompletableFuture 提供了非常强大的 Future 的扩展功能,可以帮我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法
  • 它可能代表一个明确完成的 Future,也可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作

实现 Future 和 CompletionStage 接口

  • CompletionStage
    • 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另一个阶段,有些类似 Linux 系统的管道分隔符传参数
    • 一个阶段的计算执行可以是一个 Function,Consumer 或者 Runnable
    • 一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

核心静态方法

  • runAsync 无返回值
    • runAsync(Runnable runnable)
    • runAsync(Runnable runnable, Executor executor)
  • supplyAsync 有返回值
    • supplyAsync(Supplier<U> supplier)
    • supplyAsync(Supplier<U> supplier, Executor executor)
  • 上述 Executor executor 参数说明
    • 没有指定 Executor 的方法,直接使用默认的 ForkJoinPool.commonPool()
    • 如果指定线程池,则使用我们自定义或者特别指定的线程池执行异步代码

优点

  • 异步任务结束时,会自动回调某个对象的方法
  • 主线程设置好回调后,不再关心异步任务的执行,异步任务之间可以顺序执行
  • 异步任务出错时,会自动回调某个对象的方法

get() 和 join() 方法区别

  • 调用 join 方法时,编译时不会报出检查时的异常
  • 调用 get 方法时,编译时会报出检查时的异常

线程池说明

  • 没有传入自定义线程池,都用默认线程池 ForkJoinPool
  • 如果你执行第一个任务的时候,传入了一个自定义线程池
    • 调用 thenRun 方法执行第二个任务时,则第二个任务和第一个任务是共用同一个线程池
    • 调用 thenRunAsync 执行第二个任务时,则第一个任务使用的是你自己传入的线程池,第二个任务使用的是 ForkJoinPool 线程池
  • 有可能处理太快,系统优化切换原则,直接使用 main 线程处理

常用方法API

获得结果和触发计算

  • get() :调用时阻塞
  • get(long timeout, TimeUnit unit) : 超过时间不等待
  • join() :不抛异常
  • getNow(T valueIfAbsent) :提供默认值,计算完成返回结果,不阻塞
  • complete(T vlaue):是否打断 get 方法立即返回括号值

对计算结果进行处理

  • thenApply:计算结果存在依赖关系,这两个线程串行化;由于存在依赖关系,当前步骤有异常就叫停
  • handle:计算结果存在依赖关系,这两个线程串行化;有异常也可以往下一步走,根据带的异常参数可以进一步处理

对计算结果进行消费

  • thenRun:任务 A 执行完执行 B,并且 B 不需要 A 的结果
  • thenAccept:任务 A 执行完执行 B,B 需要 A 的结果,但是任务 B 无返回值
  • thenApply:任务 A 执行完执行 B, B 需要 A 的结果,同时任务 B 有返回值

对计算速度进行选用

  • applyToEither: 对于两个线程相比较,哪个比较快就用哪个

对计算结果进行合并

  • thenCombine:两个 CompletionStage 任务都完成后,最终能把两个任的结果一起交给 thenCombine 来处理,先完成的等待另一个完成

相关文章:

JUC 之 CompletableFuture

——CompletableFuture Future Future 接口&#xff08;FutureTask 实现类&#xff09; 定义了操作异步任务执行的一些方法&#xff0c;如获取异步的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕例如&#xff1a; 主线程让一个子线程去执行任务&…...

7-vue-1

谈谈你对MVVM的理解 为什么要有这些模式&#xff0c;目的&#xff1a;职责划分、分层&#xff08;将Model层、View层进行分类&#xff09;借鉴后端思想&#xff0c;对于前端而已&#xff0c;就是如何将数据同步到页面上 MVC模式 代表&#xff1a;Backbone underscore jquer…...

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…...

【Java】Synchronized锁原理和优化

一、synchronized介绍 synchronized中文意思是同步&#xff0c;也称之为”同步锁“。 synchronized的作用是保证在同一时刻&#xff0c; 被修饰的代码块或方法只会有一个线程执行&#xff0c;以达到保证并发安全的效果。 synchronized是Java中解决并发问题的一种最常用的方法…...

西北工业大学2020-2021学年大物(I)下期末试题选填解析

2 位移电流。磁效应服从安培环路&#xff0c;热效应不服从焦耳-楞次定律。注意&#xff0c;它是变化的电场而非磁场产生。3 又考恒定磁场中安培环路定理。4感生电场5 麦克斯韦速率分布函数。6 相同的高温热源和低温热源之间的一切可逆热机的工作效率相等&#xff0c;无论工质如…...

PHP - ChatGpt API 接入 ,代码,亲测!(最简单!)

由于最近ChatGpt 大火&#xff0c;但是门槛来说是对于大家最头疼的环节&#xff0c; 我自己也先开发了一个个人小程序&#xff01;大家可以访问使用下&#xff0c; 由此ChatGpt 有一个API 可以仅供大伙对接 让我来说下资质&#xff1a; 1&#xff1a;首先要搞得到一个 ChatGp…...

物联网MQTT协议简单介绍

物联网曾被认为是继计算机、互联网之后&#xff0c;信息技术行业的第三次浪潮。随着基础通讯设施的不断完善&#xff0c;尤其是 5G 的出现&#xff0c;进一步降低了万物互联的门槛和成本。物联网本身也是 AI 和区块链应用很好的落地场景之一&#xff0c;各大云服务商也在纷纷上…...

Dubbo 源码解读:负载均衡策略

概览 org.apache.dubbo包下META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.LoadBalance中内部spi实现类有以下几种&#xff1a; randomorg.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance roundrobinorg.apache.dubbo.rpc.cluster.loadbalance.RoundRobinL…...

吃瓜教程笔记—Task04

神经网络 知识点 M-P神经元 模型如图所示&#xff1a;  神经元的工作机理&#xff1a;神经元接收来到n个其他神经元传递过来的输入信号&#xff0c;这些输入信号通过带权重的连接进行传递&#xff0c;神经元接收到的总输入值将与神经元的阈值进行比较&#xff0c;然后通过…...

进程地址空间(虚拟地址空间)

目录 引入问题 测试代码 引入地址空间 故事1&#xff1a; 故事二&#xff1a; 解决问题 为什么有虚拟地址空间 扩展 扩展1&#xff08;没有地址空间&#xff0c;OS如何工作&#xff09; 扩展2 &#xff08;代码只读深入了解&#xff09; 扩展3&#xff08;malloc本质…...

【项目精选】基于Vue + ECharts的数据可视化系统的设计与实现(论文+源码+视频)

今天给小伙伴们推荐一款超优秀的全新Vue3.0大数据系统Vue3-bigData。 点击下载源码 vue3-bigdata 基于vue3.0echarts构建的可视化大屏图表展示系统。包括各种可视化图表及Vue3新API使用。 功能 柱状图、饼图、词云图、漏斗图 水球图、折线图 仪表盘、雷达图 矩形树图、关系…...

JavaScript Window Screen

文章目录JavaScript Window ScreenWindow ScreenWindow Screen 可用宽度Window Screen 可用高度JavaScript Window Screen window.screen 对象包含有关用户屏幕的信息。 Window Screen window.screen对象在编写时可以不使用 window 这个前缀。 一些属性&#xff1a; screen…...

【双重注意机制:肺癌:超分】

Dual attention mechanism network for lung cancer images super-resolution &#xff08;肺癌图像超分辨率的双重注意机制网络&#xff09; 目前&#xff0c;肺癌的发病率和死亡率均居世界恶性肿瘤之首。提高肺部薄层CT的分辨率对于肺癌筛查的早期诊断尤为重要。针对超分辨…...

各种中间件的使用

init background 这一部分我们学习一些常用的&#xff0c; 但是不需要深入理解的中间件 &#xff0c; 例如kafka ,分布式文件系统。 summary Content what is kafka? What time to used it ? 其实消息队列就是解决系统之间复杂交互例如聊天系统和交易系统&#xff0c; …...

Systemverilog覆盖率的合并和计算方式

在systemverilog中&#xff0c;对于一个covergroup来说&#xff0c;可能会有多个instance&#xff0c;我们可能需要对这些instance覆盖率进行操作。 只保存covergroup type的覆盖率&#xff0c;不需要保存instance-specified的覆盖率coverage type和instance-specified的覆盖率…...

(周末公众号解读系列)2000字-视觉SLAM综述

参考链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg2NzUxNTU1OA&mid2247528395&idx1&sn6c9290dd7fd926f11cbaca312fbe99a2&chksmceb84202f9cfcb1410353c805b122e8df2e2b79bd4031ddc5d8678f8b11c356a25f55f488907&scene126&sessionid1677323905…...

力扣29-两数相除

29. 两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#x…...

【MindSpore】安装和使用MindSpore 2.0.0版本简单实现数据变换Transforms功能

本篇文章主要是讲讲MindSpore的安装以及根据官方提供的例子实现数据变换功能。 昇思MindSpore是一款开源的AI框架&#xff0c;旨在实现易开发、高效执行、全场景覆盖三大目标。 目录1、加入MindSpore社区2、安装前准备2.1、获取安装命令2.2、安装pip2.3、确认系统环境3、安装Mi…...

PRML笔记4-绪论中推断和决策小结

在推断阶段使用训练数据学习后验概率p(Ck∣x)p(\mathcal{C_k}|\boldsymbol{x})p(Ck​∣x)的模型&#xff1b;在决策阶段使用后验概率进行最优的分类&#xff1b;亦或是同时解决推断和决策问题&#xff0c;简单的学习一个函数f(x)f(\boldsymbol{x})f(x)&#xff0c;将输入x\bold…...

DSPE-PEG-Streptavidin;Streptavidin-PEG-DSPE;磷脂聚乙二醇链霉亲和素,科研用试剂

DSPE-PEG-Streptavidin 中文名称&#xff1a;二硬脂酰基磷脂酰乙醇胺-聚乙二醇-链霉亲和素 中文别名&#xff1a;磷脂-聚乙二醇-链霉亲和素&#xff1b;链霉亲和素PEG磷脂 英文常用名&#xff1a;DSPE-PEG-Streptavidin&#xff1b;Streptavidin-PEG-DSPE 外观&#xff1a;粉…...

实战应用:基于编译原理,利用快马AI构建你的首个代码压缩工具

实战应用&#xff1a;基于编译原理&#xff0c;利用快马AI构建你的首个代码压缩工具 最近在学习编译原理&#xff0c;发现这门看似高深的学科其实离我们日常开发很近。比如代码压缩工具&#xff0c;就是编译原理技术的典型应用场景。今天就用InsCode(快马)平台来快速实现一个简…...

从噪音到宁静:5种高级风扇控制策略深度解析

从噪音到宁静&#xff1a;5种高级风扇控制策略深度解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanContro…...

鸿蒙应用开发实战:手把手教你封装一个可复用的音乐播放器管理类(ArkTS版)

鸿蒙应用开发实战&#xff1a;构建高可复用的音乐播放器管理类&#xff08;ArkTS版&#xff09; 在鸿蒙应用开发中&#xff0c;音频播放功能是许多应用的核心需求。本文将深入探讨如何设计一个健壮、可复用的音乐播放器管理类&#xff0c;采用ArkTS语言实现&#xff0c;帮助开发…...

Vivado MIG IP核实战:DDR3控制器配置与仿真全流程解析

1. Vivado MIG IP核与DDR3控制器基础认知 第一次接触DDR3控制器时&#xff0c;我被那些密密麻麻的时序图吓得不轻。直到发现Xilinx的MIG&#xff08;Memory Interface Generator&#xff09;IP核&#xff0c;才明白原来FPGA开发可以这么"偷懒"。这个IP核就像个贴心的…...

别再手动埋点了!用OpenTelemetry Operator在K8s里给Java应用自动注入链路追踪(附完整YAML)

零代码改造&#xff1a;OpenTelemetry Operator在K8s中实现Java应用全自动观测 当微服务架构遇上云原生环境&#xff0c;可观测性成为工程团队的生命线。但传统埋点方案需要侵入业务代码、增加维护成本&#xff0c;这与快速迭代的DevOps理念背道而驰。本文将揭示如何通过OpenTe…...

5步释放Win11潜能:用Win11Debloat让系统性能提升60%的实战指南

5步释放Win11潜能&#xff1a;用Win11Debloat让系统性能提升60%的实战指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

终极指南:如何在Windows 10上免费安装Android子系统

终极指南&#xff1a;如何在Windows 10上免费安装Android子系统 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想在Windows 10电脑上畅玩手机游戏…...

AI推动SEO关键词优化的全新策略与实践明晰

在当前数字营销环境中&#xff0c;AI技术为SEO关键词优化带来了前所未有的变革。它通过自动化的数据分析与挖掘工具&#xff0c;能够帮助企业更准确地识别用户需求与搜索趋势。通过AI的支持&#xff0c;关键词挖掘变得更加高效和精准&#xff0c;企业可以快速获取相关关键词并优…...

AI大模型时代:微店商品数据API如何重构反向海淘决策

在AI大模型时代&#xff0c;微店商品数据API凭借覆盖下沉市场、小众货源、私域供给的独特优势&#xff0c;成为重构反向海淘决策的核心支撑&#xff0c;将传统“人工经验判断”升级为“数据采集→AI分析→自动决策→反馈优化”的全链路数据驱动模式&#xff0c;大幅提升选品精准…...

Windows Cleaner智能清理工具:系统优化与空间释放的全面解决方案

Windows Cleaner智能清理工具&#xff1a;系统优化与空间释放的全面解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 随着计算机使用时间的增长&#xff0…...