多线程:多线程设计模式(二):Future模式
一、什么是Future模型:
该模型是将异步请求和代理模式联合的模型产物。类似商品订单模型。见下图:
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。
二、Future模式的核心结构:
Main:启动系统,调用Client发出请求;
Client:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;
Data:返回数据的接口;
FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;
RealData:真实数据,构造比较慢。
三、Future模式的代码实现:
(1)Main函数:
- <span style="font-size:18px;">package tgb;
 - public class Main {
 - public static void main(String[] args){
 - Client client = new Client();
 - //理解返回一个FutureData
 - Data data = client.request("name");
 - System.out.println("请求完毕!");
 - try{
 - //处理其他业务
 - //这个过程中,真是数据RealData组装完成,重复利用等待时间
 - Thread.sleep(2000);
 - }catch (Exception e){
 - }
 - //真实数据
 - System.out.println("数据 = "+ data.getResult());
 - }
 - }
 - </span>
 
(2)Client的实现:
- <span style="font-size:18px;">package tgb;
 - public class Client {
 - public Data request(final String queryStr){
 - final FutureData future = new FutureData();
 - //开启一个新的线程来构造真实数据
 - new Thread(){
 - public void run(){
 - RealData realData = new RealData(queryStr);
 - future.setRealData(realData); }
 - }.start();
 - return future;
 - }
 - }
 - </span>
 
(3)Data的实现:
- <span style="font-size:18px;">package tgb;
 - public interface Data {
 - public String getResult();
 - }
 - </span>
 
(4)FutureData:
- <span style="font-size:18px;">package tgb;
 - /**
 - * 是对RealData的一个包装
 - * @author limin
 - *
 - */
 - 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 (Exception e){
 - }
 - }
 - return realData.result;
 - }
 - }
 - </span>
 
(5)RealData实现:
- <span style="font-size:18px;">package tgb;
 - public class RealData implements Data {
 - protected String result;
 - public RealData(String para){
 - //构造比较慢
 - StringBuffer sb= new StringBuffer();
 - for(int i=0;i<10;i++){
 - sb.append(para);
 - try{
 - Thread.sleep(1000);
 - }catch(Exception e){
 - }
 - result= sb.toString();
 - }
 - }
 - @Override
 - public String getResult() {
 - return result;
 - }
 - }
 - </span>
 
注意:
FutureData是对RealData的包装,是dui真实数据的一个代理,封装了获取真实数据的等待过程。它们都实现了共同的接口,所以,针对客户端程序组是没有区别的;
客户端在调用的方法中,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的;
因为咋FutureData中的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。
转:http://blog.csdn.net/lmdcszh/article/details/39696357
多线程:多线程设计模式(二):Future模式的更多相关文章
- 多线程的设计模式:Future、Master-Worker
		
一 简介 并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象.与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍==Fut ...
 - 多线程(10) — Future模式
		
Future模式是多线程开发中常用常见的一种设计模式,它的核心思想是异步调用.在调用一个函数方法时候,如果函数执行很慢,我们就要进行等待,但这时我们可能不着急要结果,因此我们可以让被调者立即返回,让它 ...
 - 多线程学习之二坚不可摧模式Immutable pattern
		
Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者 1.1:immutable参与者是一个 ...
 - 多线程设计模式(二):Future模式
		
一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...
 - 多线程设计模式——Read-Write Lock模式和Future模式分析
		
目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...
 - 多线程设计模式 - Future模式
		
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
 - 13.多线程设计模式 - Future模式
		
多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...
 - 多线程设计模式 - Future模式之JAVA原生实现
		
在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...
 - java多线程系列13 设计模式 Future 模式
		
Future 模式 类似于ajax请求 页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 ...
 
随机推荐
- Vue过渡效果之JS过渡
			
前面的话 与CSS过渡不同,JS过渡主要通过事件进行触发.本文将详细介绍Vue过渡效果之JS过渡 事件钩子 JS过渡主要通过事件监听事件钩子来触发过渡,共包括如下的事件钩子 <transitio ...
 - unity slua整合帅气的lua-pb解析protobuf
			
了解到lua的一个protobuf库,接口帅气,比之前用过的一些lua protobuf库要好很多,深得我心.而且能保持更新,比其他库几年没更新要放心. lua-pb动态解析protobuf协议,无需 ...
 - 【Linux Shell】uname命令行
			
常用命令uname -v # uname -i #uname -a dream361@master:~$ uname -n #主机名称 master dream361@master:~$ uname ...
 - 2017-05-4-C语言学习笔记
			
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
 - 使用angular的HttpClient搭配rxjs
			
一.原Http使用总结 使用方法 在根模块或核心模块引入HttpModule 即在AppModule或CoreModule中引入HttpModule: import { HttpModule } fr ...
 - asp.net mvc 接入美圣短信 验证码发送
			
第1步:登录美圣短信控制台 http://www.rcscloud.cn/hy/HY_ZH/login 账号:******* 密码:******* http://www.rcscloud.cn/com ...
 - linux ls 命令
			
ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...
 - kindeditor上传图片时候,上传成功了,但是页面上却提示失败
			
今天尝试着kindeditor做一个上传demo,碰到了一个日狗的问题,百度谷歌都没有答案,最后查看源码才发现问题所在,记录一下,福利大众. 碰到问题如下,图片后台明明上传成功了,返回信息也是正确的, ...
 - Spring加载properties文件的属性的值
			
要使用配置文件的值首先在spring.xml配置加载properties文件 <context:property-placeholder location="classpath:ife ...
 - mysql 用多次查询代替一次复杂join查询的优点分析
			
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt344 多高性能的应用都会对关联查询进行分解.简单地,可以对每一个表进行一次单 ...