java 设计模式 future_java-23种设计模式-Future模式

Future模式是多线程开发中非常常见的一种设计模式。

它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。

但有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。

就像我们在网上购物,你买了一个包之后会给你生成一个电子的订单凭证,你只需要持有凭证等待包送过来就行了,这期间你可以做其他你想做的事情。

对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。

2 Future模式和非Future模式的区别

在传统的同步方法中调用一些耗时的程序,需要等待一个方法完成后才能进行下一步。而Future模式中客户端调用完成后并不急于去做处理,而去调用其他的业务,这样充分利用了时间,这就是Future模式的核心。

858d1858710f

image.png

3 Future模式的主要成员

Main:系统启动,调用client发送请求。

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

Data:返回数据的接口。

FutureData:Future数据构造快,但是是一个虚拟的数据,需要装配RealData。

RealData:真实数据。

4 Future模式的简单实现

Data接口,这个是客户端希望得到的数据

public interface Data {

public String getResult();

}

RealData是最终需要使用的数据模型,使用sleep()模拟构造过程。

public final String result;

public RealData(String result) {

System.out.println("RealData start " + System.currentTimeMillis());

//模拟构造时间长

StringBuffer sb = new StringBuffer();

for (int i = 0;i<10;i++){

sb.append(result);

try{

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("RealData end " + System.currentTimeMillis());

this.result = sb.toString();

}

@Override

public String getResult() {

return result;

}

}

FutureData实现一个快速返回RealData包装

public class FutureData implements Data {

public RealData realData = null;

public boolean isReady = false;

public synchronized void setRealData(RealData realData){

if (isReady){

return;

}

this.realData = realData;

isReady = true;

this.notifyAll(); //realData已经被注入 通知getResult启动

}

@Override

public synchronized String getResult() {

while (!isReady){

try {

System.out.println("wait start " + System.currentTimeMillis());

this.wait(); //等待realData被注入

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("wait end " + System.currentTimeMillis());

return realData.result;

}

客户端主要实现获取FutureData,开启构造RealData线程。

main方法调用发起请求。

public class Client {

public Data request(final String queryStr){

final FutureData future = new FutureData();

new Thread(){

@Override

public void run(){

System.out.println("run start " + System.currentTimeMillis());

RealData realData = new RealData(queryStr);

System.out.println("run end " + System.currentTimeMillis());

future.setRealData(realData);

}

}.start();

//立即返回futureData

return future;

}

public static void main(String[] args) {

Client client = new Client();

//返回的futureData

Data data = client.request("name");

System.out.println("请求完成");

try{

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("main end");

System.out.println(System.currentTimeMillis());

System.out.println("真实数据"+data.getResult());

}

作者本人也是将近十年码农了,码字不易,如果看了有用就点个喜欢个作者,作者会继续跟新一些技术问题哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值