多线程:多线程设计模式(二):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请求 页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 ...
随机推荐
- 安卓开发中SQLite的使用(附实例)
在Android平台上系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取.下面以我自己创建的收入信息表(InAccount)为例,来学习SQLite的使用. 主要是四个 ...
- rtems的GNU(GCC)编译环境配置
// 创建目录 /home/shael/rtems/build //存放解压包和编译包目录 /home/shael/rtems/archive //存放源码包目录 /home/shael/rt ...
- Go基础
Go编程基础 package 别名 当使用第三方包时,包名可能会非常接近或者相同,此时就可以使用别名来进行区别和调用 //当前程序的包名 package main //导入其他的包 import &q ...
- WPF控制动画开始、停止、暂停和恢复
1.闲言 好久也没更新一博客了,自己有点发懒,同时确实这几个月来也有点忙.风机监测软件,项目中,有这样一个小需求:正常风机在旋转的时候,上位机软要做一个风机的图片,让它不停地旋转,一但检测到下面风机停 ...
- vue开发项目的坑
[Vue warn]: Do not use built-in or reserved HTML elements as component id: MenuItem [Vue warn]: Do n ...
- Yii2 报错Getting unknown property: app\models\Product::
解决方法:查看是否存在 "$a->$abc"的写法,应改成$a->abc
- php ddos 安全处理代码
<?php//查询禁止IP$ip =$_SERVER['REMOTE_ADDR'];$fileht=".htaccess2";if(!file_exists($fileht) ...
- Kickstart Round D 2017 problem A sightseeing 一道DP
这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...
- HTTP Components简介
基于版本4.5.x 简介 组件 HttpClient,核心组件 HC Fluent,提供了流式操作接口 HttpMime,提供文件上传时用到的一些工具类 HttpClient Cache,有待学习 H ...
- poj2051 Argus
Description A data stream is a real-time, continuous, ordered sequence of items. Some examples inclu ...