Future模式

思路介绍

该模式其实思想的本质就是异步调用。异步调用这个词我们听的非常多,最让我映像深刻的异步调用方式就是前端的ajax,它很直观的让我理解了什么是异步调用:在加载页面的过程中,由于页面很多元素需要动态加载,但是,加载的过程中有很多元素是重复了,那么为了得到这些动态元素,浏览器就会向后台发送请求,请求发出到响应是需要时间的,但是,浏览器并不会阻塞在这里等待,而是继续加载其他内容,直到这个响应到了,才将这些动态内容渲染进去。

举这个例子就是说明一下什么是异步调用:通过调用并立马返回不阻塞整个线程,等到结果返回以后取结果。

用一张时序图来说明就是:

image.png

上图为阻塞的方式,通过阻塞调用函数,等到能够访问到结果以后,拿到数据。

image.png

上图则为future模式,通过快速返回结果的方式不阻塞线程。

过程实现

既然知道了这个的大致思路,那我们分析一下,如何实现这样一个模式呢?我们首先抓住几个关键词:快速返回、真实数据生成以后再返回。

  1. 快速返回

要做到快速返回必然是不能在函数中等待结果,而是创建一个新线程,让别的线程做计算,本函数快速返回虚假数据。

  1. 真实数据生成后返回

这里可以使用一个标志来标注数据已经完成,那么可以判断如果完成了就加载,数据就行。

示例代码

future模式示例代码

JDK中的future模式

我们这里自己实现了该模式以后,那我们看看java源码如何做的。当然,jdk源码肯定复杂很多,我们首先是了解它的一些核心组件和关系

image.png

通过上面这张图,我们可以看到很多多线程常常使用的接口,比如Runnable,而我们的Future接口就类似我们例子中的Data接口,通过一个数据返回的功能,而这个Callable就是我们使用的入口,Callable接口的使用类似于Runnable,只不过通过RunnableFuture包装以后,最终跑起来的还是Runnable。

示例代码

jdk中使用future的案例

你可能感兴趣的:(Future模式)