• 摘要: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模式原理自定义实现的更多相关文章

  1. 14.Java中的Future模式

    jdk1.7.0_79  本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  3. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  4. java中 immutable,future,nio

    什么是Future? 用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应 ...

  5. Java中的Future相关

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  6. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  7. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  8. 小学生之Java中迭代器实现的原理

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...

  9. java中jvm的工作原理

    首先我们安装了jdk和jre,但是jdk是为java软件开发工程师而使用的开发工具,我们运行java项目只要含有jre文件即可.对于jvm是内存分配的一块区域,我们知道,当我们开始使用java命令时, ...

随机推荐

  1. P1736 创意吃鱼法 图的DP

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  2. SpringBoot的Controller使用

    一: 1.注解 2.control注解 3.效果 4.RespomseBody package com.caojun.springboot; import org.springframework.be ...

  3. [代码审计]eyoucms前台未授权任意文件上传

    0x00 背景 来公司差不多一年了,然而我却依旧没有转正.约莫着转正也要到九月了,去年九月来的,实习,转正用了一年.2333 废话不多说了,最近有其他的事要忙,很久没有代码审计了.难的挖不了,浅的没意 ...

  4. 使用Plant Simulation连接SQL Server

    1. 在管理类库中添加ODBC. 2. 在控制面板->管理工具中设置ODBC,添加SQL Server服务. 3. 在plant simulation中将信息流中的ODBC添加到Frame中. ...

  5. Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

    Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...

  6. 1、QThreadPool线程池的使用,线程和Widget通过QMetaObject::invokeMethod交互。

    自定义一个QThreadPool,N个线程QRunnable,线程和Widget通过QMetaObject::invokeMethod交互. QRunnable非继承自QObject,所以不可以用信号 ...

  7. MikroTik RouterOS 5.x破解工具HunterTik

    HunterTik目前网络上流传的版本大概就两个版本2.3.1和2.3.1.1,其实效果基本一致,都是不能破解高版本的RouterOS,比如6.6以后的版本就不行了. 一.安装: 一路回车! 二.可以 ...

  8. A CANBus Tiny Network without Transceiver ICs : STM32F4 Discovery

    Sometimes you have a CAN equipped processor on a low cost board but it has no CAN transceiver chips. ...

  9. CRC 概述

    Acquired from: ftp.adelaide.edu.au:/pub/rocksoft/crc_v3.txt or ftp://ftp.rocksoft.com/papers/crc_v3. ...

  10. Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...