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. vue计算属性和侦听器

    一.计算属性: main.js: var app = new Vue({ el: '#app', data: { math: 80, physics: 90, english: 30 }, compu ...

  2. [转载]要提高SQL查询效率where语句条件的先后次序应如何写

    出处:https://www.cnblogs.com/exe19/p/5786806.html 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则 ...

  3. 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置

    Visual Studio 2017的"最近的文件列表"和"项目列表"总是删了之后重启电脑又出现(PS:这期间没有打开过项目,更没打开过VS). 一怒之下,按照 ...

  4. Hopfield神经网络

    神经网络分类 多层神经网络:模式识别 相互连接型网络:通过联想记忆去除数据中的噪声 1982年提出的Hopfield神经网络是最典型的相互连结型网络. 联想记忆 当输入模式为某种状态时,输出端要给出与 ...

  5. Linux文件结构

    /: 根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin: bin 就是二进制(binary)英文缩写.在一般的系统当中,都可以在这个目录下找到 ...

  6. B站(Bilibili) 视频的下载。

    1) 第一种是众所周知的方法,在URL的 bilibili 前加个 i, 就可以有视频的mp4的地址,然后用下载器下载. 比如 想 下载 https://www.bilibili.com/video/ ...

  7. RabbitMq(6) 如何保证消息不丢包

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  8. Expression的烦恼

    var tar = Expression.Label(typeof(int)); var p1=Expression.Parameter(typeof(int), "a"); va ...

  9. Django-2.1基础操作

    创建项目 安装django pip3 install django #查看django版本 django-admin --version python -m django --version 2.1. ...

  10. C++将十进制数转化为二进制

    #include<iostream> using namespace std; void main() { ; ]; cin>>n; i=n; while(i) { a[j]= ...