多线程设计模式--Future模式
来源:互联网 发布:淘宝客代购是什么意思 编辑:程序博客网 时间:2024/05/21 09:52
什么是Future模式?
Future模式有点类似于我们网购。大家都知道,当我们下好订单完成支付时,商品不会立刻送到我们的手中,因为卖家需要根据订单从仓库取货,然后选择物流发货,经过一段时间后才能送到我们手上。而在这一段时间内,我们完全不需要在家苦苦等候,可以处理其它事务。
那么联想到我们程序设计上。当一段程序提交了一个请求,并希望获得一个答复。但是服务端对这个请求处理是非常慢的(例如Htpp或者Web Service等不太高效的请求),在单线程的情况下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。而在Future模式中,调用模式使用异步,原先主程序中用于等待结果的时间段,可以用于处理其它的事务。
代码实现
下面我们用个简单的实例来实现一下Future模式
首先我们来明确一下Future的参与者
Main ,主程序,系统主线程,调用Client发出请求
Client ,返回Data对象,请求发出立马返回FutureData,开启另外一个线程来装配RealData。
Data ,返回数据接口
FutureData, Data的实现类,Future数据,构造快,但是数据是虚拟的,需要装配RealData
RealData ,真实数据,构造比较缓慢。
代码
Main
public static void main(String[] args) { Client client = new Client(); Data data = client.request("name");//先返回FutureData,即时返回 System.out.println("请求完毕"); try{ Thread.sleep(20);//其他逻辑操作 System.out.println("沉睡完毕"); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("数据="+data.getResult());//真数据的返回 }
Client
public Data request(final String queryStr){ final FutureData future = new FutureData(); new Thread(){//开启另一线程来装配RealData public void run(){ RealData realdata = new RealData(queryStr); future.setRealData(realdata); } }.start(); return future; }
Data
public interface Data{ public String getResult();}
FutureData
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();//唤醒getResult } @Override public synchronized String getResult() { while(!isready){ try{ wait();//等待RealData被注入 }catch(InterruptedException e){ e.printStackTrace(); } } return realdata.result; }}
RealData
public class RealData implements Data { protected final String result; public RealData(String para){//模拟真实数据的构造,比较耗时 StringBuffer sb = new StringBuffer(); for(int i=0;i<10;i++){ sb.append(para); try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } this.result=sb.toString(); } public String getResult(){ return this.result; }}
以上那就是简单一个Future模式的简单示例。
ps:上述篇章内容来自一本书,但是时间过长,我给忘记书名了,那本书让我受益匪浅。
- Future-多线程设计模式
- Future --- 多线程设计模式
- 多线程设计模式:Future模式
- 多线程设计模式--Future模式
- Future模式 多线程设计模式
- 多线程设计模式-Future模式
- java 多线程设计模式之future
- 多线程设计模式(Future/Master-Worker)
- Java 多线程的设计模式之 Future
- 【多线程系列】future模式
- 架构之路--多线程的设计模式之Future模式
- java多线程模式:Future模式
- Future设计模式
- 十,Future设计模式
- java多线程设计模式笔记之Future Pattern
- 多线程Future模式简单实现
- 多线程编程中Future模式
- Java多线程技术研究(四)-Callable,Future/FutureTask,及Future设计模式
- WPF 个人音乐播放器
- CodeForces 493C Vasya and Basketball(模拟 + 二分)
- 数据结构实验之查找三:树的种类统计
- 自制jar包(二次打包)及使用
- 求两个节点的最近祖先
- 多线程设计模式--Future模式
- Android Studio提升Gradle的构建
- 计蒜客 数据结构 队列——循环队列 C++
- LOCATION issue about create external table
- redis配置文件参数说明
- 配置自己的spec文件
- Jquery的容器转换为对象,对象转换为容器
- 中山大学南方一号集群系统安装ABySS 1.9.0
- Android 自定义控件 时钟的实现