java Future模式的使用
2024-10-15 18:23:19
一、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;
} }
最新文章
- 使用PHP获取时间今天 明天 昨天 时间戳的详解
- 内存中OLTP(Hekaton)里的事务日志记录
- HDU 4417 (划分树+区间小于k统计)
- HTML5移动开发中的meta与link
- GPRS组网的几种方案【来自网络】
- Boost的自动链接功能
- c/c++ SQLite3的常用使用方法;
- Http协议规范及格式
- C++的三大特性:封装、继承和多态性的详解
- 【转】git - 简易指南
- forward 和redirect
- 树莓派(centos7)安装mysql
- Cassandra创建第一个用户
- Custom Voice 操作步骤
- triggerHandler不执行事件默认值
- nginx在centos &; ubuntu上的安装
- Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)
- Qt5显示中文字符
- 扩展jquery scroll事件,支持 scroll start 和 scroll stop
- Python3 Tkinter-PaneWindow
热门文章
- Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法
- js Dom 编程
- 浅谈教你如何掌握Linux系统
- BZOJ2159 Crash的文明世界(树形dp+斯特林数)
- P2464 [SDOI2008]郁闷的小J
- 浅析python日志重复输出问题
- MT【233】染色正方形
- 【POI每日题解 #5】 DWU-Double-row
- 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux
- emwin之GUIBuilder使用控件命名技巧