天天看点

Java Future模式实现

Java Future模式简介

Future模式是Java多线程常用的模式,而且JDK也内置对Future模式的支持,比如在java.util.concurrent包下的FutureTask类。其核心思想在于:发出请求后,可以立即返回对象,但是这个对象实际上是个假对象,并不可立即使用,但是我们可以在干点别的事情后,就可以使用这个假对象获取结果了。这是为什么呢?因为在返回假对象的时候,偷偷的开启了一个线程去请求真正的结果数据。那么下面,我们来模拟实现下Future模式。

代码实现与分析

<a href="http://s2.51cto.com/wyfs02/M00/8B/06/wKiom1hBiN2QQwJyAABNwUkohec540.png" target="_blank"></a>

主流程是:客户端类发出请求返回,做一些其他工作后,在获取请求的结果数据。

<a href="http://s5.51cto.com/wyfs02/M02/8B/03/wKioL1hBiSvTqru3AABB2oQ8_tI599.png" target="_blank"></a>

通过上图,已经清晰的看到,在获取数据时,立即返回,同时开启了一个线程。

<a href="http://s1.51cto.com/wyfs02/M00/8B/03/wKioL1hBiauQnAdEAABZpIHVeL4815.png" target="_blank"></a>

这里需要特别注意的是使用到了wait/notify,那么为什么使用它们呢?

既然我们在请求后立即返回了一个“假对象”,如果立即调用“假对象”的方法获取结果数据,该怎么办呢?我们希望在偷偷开启的线程任务结束后,“假对象”才可以调用方法返回结果数据。因此,利用wait先阻塞住“假对象”的结果返回,当线程完成了结果数据的请求后notify通知下“假对象”可以提供结果数据了。

<a href="http://s3.51cto.com/wyfs02/M01/8B/06/wKiom1hBi1iCZ4xVAABR4JPR7X0939.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/8B/03/wKioL1hBi33ht9oTAAAOkmcFWLg764.png" target="_blank"></a>

运行结果验证:

<a href="http://s3.51cto.com/wyfs02/M00/8B/06/wKiom1hBi62zaD2EAAAn2fCy8DQ577.png" target="_blank"></a>

本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1879036,如需转载请自行联系原作者