Future模式介绍及入门使用

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模式介绍及入门使用的更多相关文章
- Future 模式介绍
		
假设一个任务执行需要花费一些时间,为了省去不必要的等待时间,可以先获取一个提货单,即future,然后继续处理别的任务,知道货物到达,即任务完成得到结果,此时可以使用提货单提货,即通过future得到 ...
 - jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
		
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
 - [转帖]Druid介绍及入门
		
Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...
 - java Future 接口介绍
		
(转自:http://blog.csdn.net/yangyan19870319/article/details/6093481) 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java ...
 - Future模式
		
Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...
 - Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)
		
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
 - 【并发编程】Future模式及JDK中的实现
		
1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...
 - 并发模型(一)——Future模式
		
多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion.不变.生产者-消费者 模式: jdk除了定义了若干并发 ...
 - 多线程设计模式 - Future模式之JAVA原生实现
		
在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...
 
随机推荐
- C#-----中使用using详解
			
1.using指令 using + 命名空间名字 例:using System; using System.Data; 2.using语句 定义一个范围,在范围结束时处理对象,出了这个范 ...
 - 用java生成32位全球唯一的id编号
			
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
 - List 循环删除 指定元素的 方法
			
使用Iterator进行循环,在删除指定元素.如果使用for 或 foreach 在删除指定下标是,list.size 会相应的缩短且下标前移,导致相邻满足条件的元素未删除 Iterator<S ...
 - 怎么让table中的<td>内容向上对齐
			
<td valign="top"></td>
 - Java内存模型学习笔记
			
Java内存模型(JMM):描述了java程序中各种变量(线程共享变量)的范根规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节.共享变量就是指一个线程中的变量在其他线程中也是可见 ...
 - python的变量和简单的数据类型
			
决定学习python这门语言了,本人资质愚钝,只会把学到的东西记录下来,供自己查漏补缺,也可以分享给和我一样正在学习python语言的人,若在记录中存在什么错误,希望多多批评指正,谢谢. Python ...
 - Python Redis hash
			
hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据 , redis中Hash在内存中的存储格式如下图: hset(name, key, value) # name对应的ha ...
 - [pytorch修改]npyio.py 实现在标签中使用两种delimiter分割文件的行
			
from __future__ import division, absolute_import, print_function import io import sys import os impo ...
 - Kubernetes 路由问题&网络问题
			
error 信息: kubectl 获取node的host地址 kubectl get pods -n $namespace -o wide 或者在Kubernetes的service中进行查看 ku ...
 - C#   说说lock到底锁谁?(2)
			
摘要 今天在园子里面有园友反馈关于[C#基础]说说lock到底锁谁?文章中lock(this)的问题.后来针对文章中的例子,仔细想了一下,确实不准确,才有了这篇文章的补充,已经对文章中的demo进行修 ...