Java设计模式——Promise模式

模式简介

Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取。这样就避免了不必要的等待,增加了系统的并发性。

模式架构

Promise模式中,客户端代码调用某个异步方法所得到的返回值仅是一个凭据对象(该对象被称为Promise,意为“承诺”)。凭借该对象,客户端代码可以获取异步方法相应的真正任务的执行结果。

Promise类图

  • Promisor:负责对外暴露可以返回Promise对象的异步方法,并启动异步任务的执行。其主要方法及职责如下。
    • compute:启动异步任务的执行,并返回用于获取异步任务执行结果的凭据对象。
  • Promise:包装异步任务处理结果的凭据对象。负责检测异步任务是否处理完毕、返回和存储异步任务处理结果。其主要方法及职责如下。
    • getResult:获取与其所属Promise实例关联的异步任务的执行结果。
    • setResult:设置与其所属Promise实例关联的异步任务的执行结果。
    • isDone:检测与其所属Promise实例关联的异步任务是否执行完毕。
  • Result:负责表示异步任务处理结果。具体类型由应用决定。
  • TaskExecutor:负责真正执行异步任务所代表的计算,并将其计算结果设置到相应的Promise实例。其主要方法及职责如下
    • run:执行异步任务所代表的计算。

执行过程

获取异步任务处理结果

image.png
  • 第1步:客户端代码调用Promisor的异步方法compute。
  • 第2、3步:compute方法创建Promise实例作为该方法的返回值,并返回。
  • 第4步:客户端代码调用其所得到的Promise对象的getResult方法来获取异步任务处理结果。如果此时异步任务执行尚未完成,则getResult方法会阻塞(即调用方代码的运行线程暂时处于阻塞状态)。

异步任务执行过程

image.png
  • 第1步:Promisor的异步方法compute创建TaskExecutor实例。
  • 第2步:TaskExecutor的run方法被执行(可以由专门的线程或者线程池来调用run方法)。
  • 第3步:run方法创建表示其执行结果的Result实例。
  • 第4、5步:run方法将其处理结果设置到相应的Promise实例上。

Java多线程编程模式实战指南之Promise模式

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,727评论 1 56
  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,333评论 5 22
  • 最近雨水多,天气却也清凉舒爽起来。夏日将至未至的这一段时间,也算是广州难得的好天气了。 上上个周末,邻居家的小美女...
    苟且趁年华阅读 1,196评论 4 5
  • 王熙曌小可爱 20岁生日快乐呀 20岁 是人生中很美好的年纪 新的年岁里 愿你成长为更好的自己 想要的都拥有 得不...
    可申阅读 623评论 0 0