java之Future模式
2018-03-24 22:50
197 查看
产生原因
当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、HTTP或者Web Service等并不太高效的方式调用的。在传统的单线程环境下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。
解决方式
请求本身仍然需要很长一段时间来处理。但是,服务程序不等数据处理完成便立即返回客户端一个伪造的数据,客户端在拿到这个返回结果后,并不急于对其进行处理,而是去调用其他业务逻辑,充分利用等待时间。在完成了其他业务逻辑的处理后,最后再使用返回比较慢的future数据。这样,在整个调用过程中,就不存在无谓的等待,充分利用了所有的时间片段,从而提高系统的响应速度。
代码逻辑。
对于客户端的每个请求,返回一个伪造的结果,然后把这个伪造的结果放入一个新的线程中,然后在新线程里处理业务的具体逻辑,处理完后把真实的结果放入伪造的结果中。客户端会检测是否是真实的结果,如果不是则等待,如果是,则返回结果。
代码实现:
Main 系统启动,电泳client发出请求
Client 返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData.
Data 返回数据的接口
FutureData Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData.
RealData 真实数据,其构造是比较慢的。
当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、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()); } }
相关文章推荐
- 彻底理解Java的Future模式
- Java中的线程(四)- Future模式
- java Future 模式
- Java高并发程序设计笔记(八)之Future设计模式
- 0101 什么是java future模式【转载】
- 彻底理解Java的Future模式
- Java.util.concurrent 包 使用Future,Callable实现抢答模式
- Java自带的Future多线程模式
- 14.Java中的Future模式
- 什么是java future模式
- Java Future模式实现
- java Future模式
- java并发包学习系列:future模式(草稿)
- Future模式Java实现
- 多线程设计模式 - Future模式之JAVA原生实现
- 彻底理解Java的Future模式
- Java之多线程中的Future模式
- Java多线程技术研究(四)-Callable,Future/FutureTask,及Future设计模式
- Java多线程编程中Future模式的详解
- Java Future接口、Future模式理解