Java中的Future模式原理自定义实现
- 摘要:Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下。该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取数据应该已经过了一段时间(因为做其他一些操作),正是这一段时间,数据通过其它线程已经
Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下。
该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取数据应该已经过了一段时间(因为做其他一些操作),正是这一段时间,数据通过其它线程已经被存放到箱子中了。
/**
* 测试
* @author yangcheng
*
*/
public class MainTest {
public static void main(String[] args){
Client client=new Client();
//拿到空箱子箱子
FeatureCar result=(FeatureCar) client.requestData("这是我发送的数据");
System.out.println("继续执行其他业务");
//从空箱子中获取数据 如果数据没有则等待,一直等到拿到数据位置————因此 在获取箱子中的数据之前可以做一些其它操作
System.out.println(result.getResult());
} }/**
* 客户端中,使用近似于javascript中的ajax的异步请求数据的这种方式获取数据
*
* 该客户端作用 需要构建异步数据获取的结构,以便让main方法直接使用该类对象获取其数据
*
* @author yangcheng
*
*/
public class Client {
//
public Data requestData(final String msg){
//创建一个同步对象直接返回(盛放物品的箱子)
final FeatureCar car=new FeatureCar(); //创建一个线程 用于获取数据(获取箱子中的物品,这个物品是在把箱子已经交给请求者之后,慢慢放进箱子中的)
new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
FeatureRealData realData=new FeatureRealData(msg);
//把真实的数据放到箱子里面
car.setRealData(realData);
}
}).start();;
//把箱子先返回给调用者 而里面的数据是通过上面的线程异步放进去的
return car;
}
}/**
* 箱子
* 用于同步返回客户端请求的数据(装东西的“箱子”,刚刚返回给调用者时箱子是空的,里面的数据是通过异步线程获取的)
*
* @author yangcheng
*
*/
public class FeatureCar implements Data{
//组合一个真实数据对象
private FeatureRealData realData;
//这里需要设置一个标识用于判断realData对象中是否为null,如果为null的时候getResult方法被执行,就需要把getResult阻塞(wait())
//默认没有值
private boolean flag=false;
public synchronized void setRealData(FeatureRealData realData) {
if(flag){
try {
//如果在非synchronized方法中调用方法 wait notify notifyAll 会报"java.lang.IllegalMonitorStateException"
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//默认setRealData方法可以直接执行 不会阻塞,
flag=true;
notify();
this.realData = realData; } @Override
public synchronized String getResult() {
// TODO Auto-generated method stub
while(true){
if (!flag) {
try {
//当realData对象为null 线程等待
System.err.println("**************************");
wait(); } catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
return realData.getResult();
} } }/**
* 被装到箱子里面的“物品”
*
* 该类的作用就是 访问数据库 并将结果返回
* @author yangcheng
*
*/
public class FeatureRealData implements Data{
private String resultData; //模拟访问数据库
public FeatureRealData(String msg){
try {
//模拟数据库访问花了3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
resultData= "返回的真实数据:数据获取成功!"; }
//将查询结果返回
@Override
public String getResult() {
// TODO Auto-generated method stub
return resultData;
} }/**
* 该接口用于规范获取数据的方法
* @author yangcheng
*
*/
public interface Data {
public String getResult();
}
from: https://www.aliyun.com/jiaocheng/1337978.html
Java中的Future模式原理自定义实现的更多相关文章
- 14.Java中的Future模式
jdk1.7.0_79 本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...
- (转)轻松学,Java 中的代理模式及动态代理
背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...
- 从虚拟机指令执行的角度分析JAVA中多态的实现原理
从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...
- java中 immutable,future,nio
什么是Future? 用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应 ...
- Java中的Future相关
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...
- Java中的代理模式
代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...
- 说说Java中的代理模式
今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...
- 小学生之Java中迭代器实现的原理
一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...
- java中jvm的工作原理
首先我们安装了jdk和jre,但是jdk是为java软件开发工程师而使用的开发工具,我们运行java项目只要含有jre文件即可.对于jvm是内存分配的一块区域,我们知道,当我们开始使用java命令时, ...
随机推荐
- 在Github和Git上fork之简单指南
http://www.linuxidc.com/Linux/2014-11/109785.htm 以我的经验来看,刚接触Git和GitHub时,最困扰的一件事情就是尝试解决下面的问题:在Git和Git ...
- Java 中的 protected 访问修饰符你真的了解吗?
protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...
- 神仙数据结构——FHQ_Treap
$FHQ\_Treap$是平衡树的一种,它不仅支持几乎所有的平衡树的操作,而且实现特别简单,总共只有两个操作.这里来简单介绍一下. 基本操作 $FHQ\_Treap$和$Treap$一样是需要用随机值 ...
- 浅谈Spring的AOP实现-代理机制
说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...
- python django + js 使用ajax进行文件上传并获取上传进度案例
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- yield, async
yield实现斐波那契序列: import sys, time def fib(): a,b,c = 0,1,0 while True: yield c a,b = b, c c = a + b if ...
- 第一次使用autohotkey的记录
第一次使用autohotkey的记录 原来想着直接用python来做模拟输入的,后面查了一下发现,目前的封装的库不一定能支持输入到游戏里,是的,我是打算用来做游戏辅助的,嘿嘿嘿 暂时来讲,我只是看完了 ...
- 20172308《Java软件结构与数据结构》第一周学习总结
教材学习内容总结 第 1 章 概述 软件质量的特征:正确性.可靠性.健壮性.可用性.可维护性.可重用性(别人写的组件自己可以拿过来用).可移植性.运行效率 数据结构:计算机存储.组织数据的方式 程序 ...
- Xtreme9.0 - Car Spark 动态规划
Car Spark 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/car-spark Descr ...
- Mac 10.12使用free命令(fish)
前提:要使用free命令,可以安装fish shell,然后在里面安装free插件. 安装fish brew install fish 安装free fish fisher free 使用 fish ...