多线程设计模式(二):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
转载于:https://www.cnblogs.com/duanxz/p/5143138.html
多线程设计模式(二):Future模式相关推荐
- Java程序性能优化 读书笔记(十)并行设计模式:Future模式
转载:Java多线程编程中Future模式的详解<转> 参考:葛一鸣,Java程序性能优化.清华大学出版社. 随着多核时代的到来,CPU的并行能力有了很大的提升.在这种背景下,传统的串行程 ...
- 大话设计模式(二)代理模式
大话设计模式(二)代理模式 前言 代理模式(Proxy Pattern)是GoF 23种Java常用设计模式之一.代理模式的定义:Provide a surrogate or placeholder ...
- 学习多线程中的 Future 模式一篇文章就够了 !!!
文章目录 一.Future 模式 二.Future模式的主要角色 三.Future模式的简单实现 四.JDK中的Future模式 五.Guava对Future模式的支持 一.Future 模式 Fut ...
- Java多线程编程中Future模式的详解
转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...
- java设计模式 (二) 创建模式
java设计模式 (二) 创建型模式 单例模式 Singleton pattern 现实场景 双11, 小华收快递, 早上圆通快递叫他下楼收快递, 刚上来, 顺丰快递叫他下楼收快递,.然后没多久EMS ...
- 设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法
1. Future模式的实现逻辑 1.1 在具体实现之前,我们先将Future模式的实现逻辑和流程理清楚,然后编写代码. 1.2 以甜品店买奶茶为例.第一步:得先有服务员:第二步:我们提交一个奶茶订单 ...
- 并发程序设计模式之Future模式
Future模式有点类似商品订单.比如在进行网上购物时,当看中某一件商品时,就可以提交订单.当订单处理完毕后,便可在家等待商品送货上门.卖家根据订单从仓库里取货,并配送到客户手上.在大部分情况下,商家 ...
- 多线程设计模式-线程池模式
定义: 使用极其有限的资源(线程池)去处理相对无限的任务 线程池模式UML图 ThreadPool: 负责接收和存储任务以及工作者线程的生命周期管理 submit: 用于接收一个任务,客户端代 ...
- 设计模式(二)-------------- 工厂模式
这篇博客我想来说一下关于工厂模式的一些知识,工厂模式在Spring框架中运用是十分广泛的.由于Spring的控制反转思想,使得我们的一些bean都交由BeanFactory统一进行管理. 那么今天我就 ...
- 设计模式(二) ——工厂模式 (3种工厂模式的实现及优缺点)
1. 工厂模式介绍 工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们在创建对象时不 ...
最新文章
- 4道经典指针笔试题讲解 ~
- Mac OS X10.11(OS X EI Capitan)安装程序下载
- vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...
- 开发日记-20190423 关键词 android静态代理类代理方法打断点debug 退出当前activity 闪退
- python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...
- 删除git commit 的 UserInterfaceState.xcuserstate 文件
- linux 虚拟机同步时间
- vim 分屏 最大化_5分钟学会Vim分屏操作方方面面
- go语言csv文件的读取与写入
- java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园
- Android 使用imageLoader来加载显示图片
- pycharm-python文件注释头
- MAC OS上将项目提交到github
- 【算法】斐波那契(黄金分割法) 查找算法
- python算法程序_浅谈python常用程序算法
- springMVC 项目在jboss7中配置应用自己的log4j
- 随机变量统计独立性的相关证明
- echarts realtime图实现
- 我的Python开发之路---微信网页授权(扫码登陆)
- linux运维要掌握哪些,学习Linux运维需要掌握哪些技能?Linux运维
热门文章
- ​618购物节,我用python逛淘宝、亚马逊,摸鱼被领导发现了
- Linux系统管理(5)——使用yum快速搭建LAMP环境【方便快捷版】
- 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
- 少数人知道的公式+思路,财务报表自动生成,财务总监用了5年
- 深入了解帆软报表系统的启动过程一
- 通过F12控制台退订育碧(Ubisoft)邮件
- python字符串转义表
- python魔法方法和普通方法_Python魔法方法之属性访问详解!
- edge无法打印pdf_一文搞定PDF无法复制/打印/编辑
- python属于哪类型的编程语言_Python是什么类型的编程语言,有什么特性