1.Future模式和多线程技术密切相关,可以说是利用多线程技术优化程序的一个实例。
Future模式的核心在于使用多线程技术去除了主函数中的等待时间,并使得原来需要等待的时间段可以用于处理其他的业务逻辑,从而充分利用计算机资源。
2.Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用。对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。
3.代码示例
a.抽象接口Data.java
/**
* 抽象接口
* @author shixiangcheng
* 2019-08-12
*/
public interface Data {
String getRequest();
}
b.包装类FutureData.java
/**
* 包装类
* @author shixiangcheng
* 2019-08-12
*/
public class FutureData implements Data {
private RealData realData;
private boolean isReady=false;
public synchronized void setRealData(RealData realData){
//若已经装载完毕,则直接返回
if(isReady){
return;
}
//若没装载,则进行装载真实对象
this.realData=realData;
isReady=true;
//进行通知
this.notify();
}
@Override
public synchronized String getRequest() {
//若没装载好,则程序一直处于阻塞状态
while(!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//装载好直接获取数据
return this.realData.getRequest();
}
}
c.真实类RealData.java
/**
* 真实类
* @author shixiangcheng
* 2019-08-12
*/
public class RealData implements Data {
private String result;
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;
}
}
d.客户端FutureClient.java
/**
* 客户端
* @author shixiangcheng
* 2019-08-12
*/
public class FutureClient {
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;
}
}
e.主函数
/**
* 主函数
* @author shixiangcheng
* 2019-08-12
*/
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);
}
}
运行结果
请求发送成功
做其它的事情
服务请求参数开始执行,这是一个很耗时的操作
执行完毕
返回结果
4.总而言之, Future模式对于多线程而言,如果线程A要等待线程B的结果,那么线程A没必要一直等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果时再取真实的结果值。
Future模式在高并发场景下是非常常见的使用套路,分布式开发中,大数据量的业务处理往往都会比较耗时,例如数据统计功能、日志备份功能,列表查询功能等,
并行设计模式是设计优化的一部分,在大型 JAVA企业级应用中,对常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。合理地使用并行模式在多线程开发中,对应用的底层架构代码搭建有着牢固地基的作用。