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 ...
随机推荐
- windows 允许其他电脑访问本地mysql数据库
第一步:用ping命令测试两台电脑是否连通 如果两台电脑是连通的请转到第二步,如果是非连通的请进行如下操作: 1.进入控制面板,打开Windows Defender 防火墙,点击高级设置(本人用的是W ...
- fabric 更详尽的用法
项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上. 修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D, ...
- 剑指offer(55)链表中环的入口节点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 1.一快一慢指针,先找到碰撞点. 2.然后碰撞点到入口节点的距离就是头结点到入口节点的距离. 具体原理可 ...
- FL Studio的模式剪辑是什么?
FL Studio里的模式剪辑功能里,有一个模式菜单.模式剪辑菜单和模式选择器面板.模式可以作为模式剪辑放置在播放列表中,模式剪辑的名称显示在剪辑的标题栏中.(注意:模式注释和事件自动化可以共享相同的 ...
- wepy开发小程序eslint报错error 'getApp' is not defined no-undef
wepy开发小程序使用getApp().globalData保存全局数据很方便,但是会在控制台看到很多报错:“error 'getApp' is not defined no-undef”,这是esl ...
- freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。
本文主要记录freeswitch学习过程. 一 安装freeswitch NOTE 以下两种安装方式,再安装的过程中遇到了不少问题,印象比较深刻的就是lua库找到不到这个问题.这个问题发生在make ...
- Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别
Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别 一.概述 在项目中遇到加载不到Spring配置文件,简单分析后,写此 ...
- 浅谈Static
A: 使用场景 static可以修饰成员变量和成员方法. 什么时候使用static修饰成员变量? 加static修饰成员的时候,这个成员会被类的所有对象所共享.一般我们把共性数据定义为静态的变量 什么 ...
- please select android sdk(出现小红叉)
问题原因: 在项目中通过 git 协同开发,项目是 kotlin 与 Java 混合开发.在 build.gradle 中添加依赖之后就出现这个问题了,点击运行无法编译. 在网上找了各种解决办法都没能 ...
- Codeforces 1100 F - Ivan and Burgers
F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...