多线程设计模式(二):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模式的更多相关文章
- 多线程设计模式——Read-Write Lock模式和Future模式分析
目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 多线程手写Future模式
future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...
- 多线程的设计模式:Future、Master-Worker
一 简介 并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象.与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍==Fut ...
- 多线程:多线程设计模式(二):Future模式
一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...
- 多线程设计模式 - Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
- 13.多线程设计模式 - Future模式
多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...
- 多线程集成设计模式--future模式
多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion 一.什么是Future模型: 该模型是将异步请求和代理 ...
随机推荐
- FZU 1759 Super A^B mod C 指数循环节
Problem 1759 Super A^B mod C Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description G ...
- hdu 5920 Wool 思路
Wool Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Problem D ...
- C++(十八) — 内存模式、堆和栈
1.内存模式 一个程序执行时,先复制到内存,然后CPU逐句读取指令执行. 每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的.比如:一台计算机256MB内存,则有256* ...
- 7z压缩gopath的src的批处理
7zGoPath.bat @echo off pushd "%~dp0" :config for /f "delims=" %%t in ('powershel ...
- week05《Java程序设计》第五次学习总结
week05<Java程序设计>第五次学习总结 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键词:接口,inteface关键词,implement关键词, ...
- 接口取不到POST参数
利用类似httprequester小工具调试API时偶尔出现一直取不到POST的数据 解决方式: 1.$_POST['paramName']: 只能接收Content-Type: applicatio ...
- Android 发布Apk签名
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
- HihoCoder 1158 : 质数相关 (最大独立集)
质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关 ...
- 接口测试基础——第4篇logging模块
Logging:日志记录是为了跟踪记录软件运行时,发生的事件,包括出错,提示信息等等. log日志级别:日志级别大小关系为:CRITICAL > ERROR > WARNING > ...
- c# 统计运行时间
long startTime = Environment.TickCount; long endTime = Environment.TickCount; long totalTime = endTi ...