博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java之Future模式
阅读量:4230 次
发布时间:2019-05-26

本文共 2372 字,大约阅读时间需要 7 分钟。

  • 产生原因
    当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、HTTP或者Web Service等并不太高效的方式调用的。在传统的单线程环境下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。
  • 解决方式
    请求本身仍然需要很长一段时间来处理。但是,服务程序不等数据处理完成便立即返回客户端一个伪造的数据,客户端在拿到这个返回结果后,并不急于对其进行处理,而是去调用其他业务逻辑,充分利用等待时间。在完成了其他业务逻辑的处理后,最后再使用返回比较慢的future数据。这样,在整个调用过程中,就不存在无谓的等待,充分利用了所有的时间片段,从而提高系统的响应速度。
  • 代码逻辑。
    对于客户端的每个请求,返回一个伪造的结果,然后把这个伪造的结果放入一个新的线程中,然后在新线程里处理业务的具体逻辑,处理完后把真实的结果放入伪造的结果中。客户端会检测是否是真实的结果,如果不是则等待,如果是,则返回结果。
  • 代码实现:
    Main 系统启动,电泳client发出请求
    Client 返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData.
    Data 返回数据的接口
    FutureData Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData.
    RealData 真实数据,其构造是比较慢的。
public interface Data {    String getResult();}
public class RealData implements Data{
protected final String result; public RealData(String para){ StringBuilder sb=new StringBuilder(); for(int i=0;i<10;i++){ sb.append(para); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } result=sb.toString(); } @Override public String getResult() { return null; }}
public class FutureData implements Data{
protected RealData realData=null; protected boolean isReady=false; public synchronized void setRealData(RealData realData){ if(isReady){ return; } this.realData=realData; isReady=true; notifyAll(); } @Override public synchronized String getResult() { while (!isReady){ try{ wait(); }catch (InterruptedException e){ e.printStackTrace(); } } return realData.result; }}
public class Client {
public Data request(final String queryStr){ final FutureData future=new FutureData(); new Thread(()->{ RealData realData=new RealData(queryStr); future.setRealData(realData); }).start(); return future; }}
public class Main {    public static void main(String[] args) {        Client client=new Client();        Data data=client.request("name");        System.out.println("请求完毕");        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }        //使用真实的数据        System.out.println("数据 = "+data.getResult());    }}

转载地址:http://lqjqi.baihongyu.com/

你可能感兴趣的文章
白硕:区块链技术与数据隐私(附视频)
查看>>
数据蒋堂 | 报表工具的SQL植入风险
查看>>
AAC ADTS LATM 格式分析
查看>>
【转载】嵌入式系统 Boot Loader 技术内幕
查看>>
【转载】uboot学习笔记
查看>>
分布式消息中间件(rabbitMQ篇)
查看>>
JAVA程序员养成计划之JVM学习笔记(2)-垃圾收集管理
查看>>
JAVA程序员养成计划之JVM学习笔记(3)-JVM性能监控
查看>>
POJ 3580
查看>>
POJ 2482
查看>>
POJ 3363
查看>>
[LeetCode] 849. Maximize Distance to Closest Person @ python
查看>>
axi总线介绍
查看>>
Linux内核中ioremap映射的透彻理解
查看>>
ffs的另外一种实现方法
查看>>
strtol的用法
查看>>
工作队列的使用
查看>>
让vim显示空格,及tab字符 vim 多行注释
查看>>
利用mmc_test.c研究mmc模块
查看>>
tasklet、wait_queue、completion、work_queue用法总结
查看>>