热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程异步编排CompletableFuture和CompletionStage

1,什么是异步异步调用实现一个不需要被等等的方法的返回值;让调用者继续执行(异步执行);在java中ÿ
1,什么是异步

        异步调用实现一个不需要被等等的方法的返回值;让调用者继续执行(异步执行);在 java 中,简单的讲就是开启另一个线程完成程序计算,使得调用者继续执行,不需要等等计 算的结果,但是调用者任然需要获取线程的计算结果(不需要同步阻塞等待)

2,Future

Future 也是一个异步计算结果返回接口,目的获取返回值结果。但是 future 在获取返回值结 构的时候,方法必须同步阻塞等待返回值结果。

         Get : 获取结果(等待,阻塞)

         Get(timeout) : 获取结果,指定等待时间

         Cancel : 取消当前任务

          isDone : 判断任务是否已经完成 (轮询) futrure 对于结果获取不是很方便,只能通过同步阻塞的方式获取结果,或者是轮询的方式 获取到结果;阻塞的方式获取返回值结果与异步的思想想违背,轮询方式又很占用 cpu 资源, 也不能及时得到我们结果。

3,异步编排

        CompletableFuture 可以帮助我们简化异步编程复杂性,提供了函数式编程的能力,可以通 过回调函数的方式处理计算结果。

public class CompletableFuture implements Future, CompletionStage CompletableFuture

具有Future的特性,还实现了CompletionStage接口,具备CompletionStage

接口的特性: 串行执行,并行执行,聚合(AND 聚合,OR 聚合)

 

1)串行关系执行

串行关系执行: then – 然后,也就是表示下一步,所以通常是一个串行的关系体现,then 后面的单词(比如 run/apply/accept)就是函数是接口中抽象方法名称;

串行关系执行:利用上一步的执行结果,去进行下一步任务执行,任务执行具有先后顺序,因此把这种操作叫做串行关系。

public CompletionStage thenRun(Runnable action);
public CompletionStage thenRunAsync(Runnable action);
public CompletionStage thenRunAsync(Runnable action,Executor executor);

public CompletionStage thenApply(Function fn);
public CompletionStage thenApplyAsync(Function fn);
public CompletionStage thenApplyAsync(Function fn,Executor executor)

thenApply此方法具有返回值,上一步直接的结果当成传参的传递给thenApply

 

public CompletionStage thenAccept(Consumer action);
public CompletionStage thenAcceptAsync(Consumer action);
public CompletionStage thenAcceptAsync(Consumer action, Executor executor);

 

public CompletionStage thenCompose(Function> fn);
public CompletionStage thenComposeAsync(Function> fn);
public CompletionStage thenComposeAsync(Function> fn, Executor executor);

2)聚合 AND Combine…… with …… 和 both…… and …… 都是要求两者都必须满足,也就是 and 且的关系。

public CompletionStage thenCombine (CompletionStage other, BiFunction fn);
public CompletionStage thenCombineAsync (CompletionStage other, BiFunction fn);
public CompletionStage thenCombineAsync (CompletionStage other, BiFunction fn, Executor executor)

public CompletionStage thenAcceptBoth (CompletionStage other, BiConsumer action);
public CompletionStage thenAcceptBothAsync(CompletionStage other, BiConsumer action);
public CompletionStage thenAcceptBothAsync(CompletionStage other,
BiConsumer action, Executor executor);
# //1、public static CompletableFuture supplyAsync(Supplier supplier);
//thenAcceptBoth: 当 2 个阶段的 CompletionStage 都执行完毕后,把结构
一块交给 thenAcceptBoth 进行执行,没有返回值
//public CompletionStage thenAcceptBoth (CompletionStage other,BiConsumer action)

public CompletionStage runAfterBoth(CompletionStage other, Runnable action);
public CompletionStage runAfterBothAsync(CompletionStage other, Runnable action);
public CompletionStage runAfterBothAsync(CompletionStage other, Runnable action, Executor executor)

3)OR 聚合

public CompletionStage acceptEitherAsync(CompletionStage other,Consumer action);
public CompletionStage acceptEitherAsync(CompletionStage other, Consumer action,Executor executor);
public CompletionStage runAfterEither(CompletionStage other, Runnable action);
public CompletionStage runAfterEitherAsync (CompletionStage other, Runnable action);
public CompletionStage runAfterEitherAsync (CompletionStage other, Runnable action, Executor executor)

4)异常处理

public CompletionStage exceptionally(Function fn);
public CompletionStage whenComplete (BiConsumer action)
public CompletionStage whenCompleteAsync (BiConsumer action);
public CompletionStage whenCompleteAsync (BiConsumer action, Executor executor);
public CompletionStage handle (BiFunction fn);
public CompletionStage handleAsync (BiFunction fn);
public CompletionStage handleAsync (BiFunction fn, Executor executor);

4 异步开启 

CompletableFuture 提供了 4 个静态的方法,来创建一个异步操作(异步开启: 从这 4 个静 态的方法开发即可)

runAsync: 没有返回值的方法,不关注返回值
public static CompletableFuture runAsync(Runnable runnable);
public static CompletableFuture runAsync(Runnable runnable,Executor executor);
# supplyAsync : 有返回值,关注返回值的。
public static CompletableFuture supplyAsync(Supplier supplier);
public static CompletableFuture supplyAsync(Supplier supplier,Executor executor)

1)RunAsync : 没有使用自定义线程池,默认使用的线程池 ForkJoinPool.commonPool

2)RunAsync 使用自己的线程

3)supplyAsync:有返回值的,关注返回值

 





推荐阅读
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
武储中专_444
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有