FutureClient代码实现:

 package com.hjf.future;

 public class FutureClient
{
/**
* 请求客户端
* @param queryStr
* @return
*/
public Data request(final String queryStr){
//1:创建一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
final FutureData fd = new FutureData();
//2:启动一个新的线程,去加载真实的数据,传递给这个代理对象
new Thread(new Runnable()
{
@Override
public void run()
{
//3:这个新的线程可以去后台加载真实的数据
RealDate rd = new RealDate(queryStr);
//4:传递给代理对象
fd.setRealData(rd);
}
}).start();
//5:返回代理对象
return fd;
}
}

FutureData代码及实现:

 package com.hjf.future;

 public class FutureData implements Data
{
/*真实数据*/
private RealDate realData; /*是否加载完成的控制器*/
private boolean isready = false; /**
* 装载真实的数据
* @param realData
*/
public synchronized void setRealData(RealDate realData)
{
//realData已经装载到FutureData中了,直接返回
if(isready){
return;
}
this.realData = realData;//装载数据
isready = true;//修改控制器
notify();
} /**
* 获取请求的最终结果
*/
@Override
public synchronized String getRequest()
{
//未加载数据的情况下保持等待 等待状态真实数据完成
while(!isready){
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
//装载完成时获取数据即可
return this.realData.getRequest();
} }

RealData代码及实现:

 package com.hjf.future;

 public class RealDate implements Data
{
/*查询结果*/
private String result; public RealDate(String queryStr){
System.out.println("根据 "+queryStr+" 进行查询,这是一个很耗时的操作..");
try
{
//模拟真实的情况
Thread.sleep(5000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("操作完毕,获取数据");
this.result = "查询结果";
} /**
* 获取真实的请求数据
* @return
*/
@Override
public String getRequest()
{
return result;
}
}

Data接口代码:

 package com.hjf.future;

 public interface Data
{
String getRequest();
}

测试类代码:

 package com.hjf.future;

 public class Main
{
public static void main(String[] args)
{
FutureClient fc = new FutureClient();
Data data = fc.request("请求参数");
System.out.println("请求发送成功"); System.out.println("做其他的事情..."); String result = data.getRequest();
System.out.println(result);
}
}

Future模式介绍及入门使用的更多相关文章

  1. Future 模式介绍

    假设一个任务执行需要花费一些时间,为了省去不必要的等待时间,可以先获取一个提货单,即future,然后继续处理别的任务,知道货物到达,即任务完成得到结果,此时可以使用提货单提货,即通过future得到 ...

  2. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

  3. [转帖]Druid介绍及入门

    Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...

  4. java Future 接口介绍

    (转自:http://blog.csdn.net/yangyan19870319/article/details/6093481) 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java ...

  5. Future模式

    Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...

  6. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  7. 【并发编程】Future模式及JDK中的实现

    1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...

  8. 并发模型(一)——Future模式

    多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion.不变.生产者-消费者 模式: jdk除了定义了若干并发 ...

  9. 多线程设计模式 - Future模式之JAVA原生实现

    在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...

随机推荐

  1. 使用CI遇到的问题报错:Call to undefined function base_url()

    问题来源:在HTML文件中使用base_url()函数引入CSS文件时,发现报错:Call to undefined function base_url() 研究了一下才知道是因为没有加载url小助手 ...

  2. 在vue项目中引入jquery

    在vue项目中引入jquerycnpm install jquery --save在main.js中引入,加入下面这行代码:import 'jquery'注:有些项目是按需加载的,在main.js里面 ...

  3. Django框架---- 信号

    Django中的信号及其用法 Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的sign ...

  4. php 数组数字 补零

    $hour_list = range(0,24); foreach($hour_list as $key=>$val){ $hour_list[$key] = str_pad($val, 2, ...

  5. Win10问题

    WIN10去除我的电脑上面的6个文件夹 把下面代码复制,保存到.reg中,然后执行即可(修改注册表文件.reg) Windows Registry Editor Version 5.00 ;如需还原去 ...

  6. shell批量修改mysql用户密码

    需求 现在有这么一个需求, 需要大批量修改用户的密码, 需要注意的规则是: 必须添加的字符: *$#sjdKw% 用户名的第一位+*$#sjdKw%+用户名的最后一位,比如用户名chenglee,密码 ...

  7. time&datetime模块详解

     一.time模块 1.时间格式转换图: 2.time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.for ...

  8. jQuery.parseJSON()方法

    jQuery.parseJSON()方法 jQuery 杂项方法 实例 解析一个 JSON 字符串 $(function () { var obj = jQuery.parseJSON('{" ...

  9. SQLServer “无法对数据库'XX' 执行删除,因为它正用于复制”的解决方法

    修改数据库某个字段的长度时出现: “无法修改表.无法对 表'dbo.N_Client_content' 执行 删除,因为它正用于复制.” 不能直接对该数据库进行操作,通过alter 的办法来修改,问题 ...

  10. SAP PI

    PI功能很是强大,且系统很稳定. 1.什么是PI PI = Process IntegrationSAP PI是一项集成的技术和平台    1.为sap和non-sap之间提供集成    2.为A2A ...