一、Future模式的使用。

Future模式简述

传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。 Futrue模式下,调用方式改为异步。

Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。

主要角色

Main:系统启动,调用Client发出请求

Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配

RealData Data:返回数据的接口

FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData RealData:真实数据,构造比较慢

二、实现代码

 Main类

public class Main {
public static void main(String[] args) {
FutureClient fc = new FutureClient();
Data data = fc.request("请求参数");
System.out.println("请求参数发送成功");
System.out.println("开始做其他事情");
String result = data.getRequest();
System.out.println(result);
}
}

FutureCliet类

public Data request(final String queryStr) {
// 1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,
// 告诉他的请求已经收到,可以干其他事情
final FutureData futureData = new FutureData(); // 2.创建一个新的线程,去加载真是数据,传递个这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
// 3.这个新的线程可以慢慢去加载真是对象,然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start(); return futureData;
}

Data接口

public interface Data {
String getRequest();
}

FutureData

public class FutureData implements Data {

    private RealData realData;

    private boolean isReady = false;

    @Override
public synchronized String getRequest() { // 如果没有装载好久一直处于阻塞状态
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 装载好可以直接获取数据
return this.realData.getRequest();
} public synchronized void setRealData(RealData realData) {
if (isReady) {
return;
}
this.realData = realData;
isReady = true;
notify();
} }

RealData

public class RealData implements Data {

    private String result;

    public RealData() {
} public RealData(String queryStr) {
System.out.println("根据" + queryStr + "进行查询" + "这是一个很耗时间的操作...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作完毕");
result = "查询结果";
} @Override
public String getRequest() {
return result;
} }

最新文章

  1. 使用PHP获取时间今天 明天 昨天 时间戳的详解
  2. 内存中OLTP(Hekaton)里的事务日志记录
  3. HDU 4417 (划分树+区间小于k统计)
  4. HTML5移动开发中的meta与link
  5. GPRS组网的几种方案【来自网络】
  6. Boost的自动链接功能
  7. c/c++ SQLite3的常用使用方法;
  8. Http协议规范及格式
  9. C++的三大特性:封装、继承和多态性的详解
  10. 【转】git - 简易指南
  11. forward 和redirect
  12. 树莓派(centos7)安装mysql
  13. Cassandra创建第一个用户
  14. Custom Voice 操作步骤
  15. triggerHandler不执行事件默认值
  16. nginx在centos & ubuntu上的安装
  17. Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)
  18. Qt5显示中文字符
  19. 扩展jquery scroll事件,支持 scroll start 和 scroll stop
  20. Python3 Tkinter-PaneWindow

热门文章

  1. Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法
  2. js Dom 编程
  3. 浅谈教你如何掌握Linux系统
  4. BZOJ2159 Crash的文明世界(树形dp+斯特林数)
  5. P2464 [SDOI2008]郁闷的小J
  6. 浅析python日志重复输出问题
  7. MT【233】染色正方形
  8. 【POI每日题解 #5】 DWU-Double-row
  9. 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux
  10. emwin之GUIBuilder使用控件命名技巧