当客户端执行方法时,立即返回一个代理对象,此时代理对象没有数据,与此同时开启一个线程去构造真实对象并把真实对象替换掉代理对象(使用set方法)。所以就会出现,客户端收到代理对象之后以为执行完了然后执行下一步,当需要调用这个代理对象的方法时,方法中返回的是构造完毕的真实对象的数据;

    利用其他方法的执行时间异步将真实对象构建出来。提高效率。

    在代理对象中的set方法中标记真实对象的构建状态,如果没有调用set方法构建状态默认为false,调用代理对象getresult方法时就无限等待。挡调用set方法时,标记代理对象构建成功,调用notifyAll唤醒等待,这样getResult方法即可返回真是对象数据。

代码摘自 https://blog.csdn.net/lmdcszh/article/details/39696357

(1)Main函数:

  1. <span style="font-size:18px;">package tgb;
  2. public class Main {
  3. public static void main(String[] args){
  4. Client client = new Client();
  5. //理解返回一个FutureData
  6. Data data = client.request("name");
  7. System.out.println("请求完毕!");
  8. try{
  9. //处理其他业务
  10. //这个过程中,真是数据RealData组装完成,重复利用等待时间
  11. Thread.sleep(2000);
  12. }catch (Exception e){
  13. }
  14. //真实数据
  15. System.out.println("数据 = "+ data.getResult());
  16. }
  17. }
  18. </span>

(2)Client的实现:

  1. <span style="font-size:18px;">package tgb;
  2. public class Client {
  3. public Data request(final String queryStr){
  4. final FutureData future = new FutureData();
  5. //开启一个新的线程来构造真实数据
  6. new Thread(){
  7. public void run(){
  8. RealData realData = new RealData(queryStr);
  9. future.setRealData(realData);           }
  10. }.start();
  11. return future;
  12. }
  13. }
  14. </span>

(3)Data的实现:

  1. <span style="font-size:18px;">package tgb;
  2. public interface Data {
  3. public  String getResult();
  4. }
  5. </span>

(4)FutureData:

  1. <span style="font-size:18px;">package tgb;
  2. /**
  3. * 是对RealData的一个包装
  4. * @author limin
  5. *
  6. */
  7. public class FutureData implements Data {
  8. protected RealData realData =null;
  9. protected boolean isReady = false;
  10. public synchronized void setRealData(RealData realData){
  11. if(isReady){
  12. return;
  13. }
  14. this.realData=realData;
  15. isReady=true;
  16. notifyAll();
  17. }
  18. @Override
  19. public  synchronized  String getResult() {
  20. while(!isReady){
  21. try{
  22. wait();
  23. }catch (Exception e){
  24. }
  25. }
  26. return realData.result;
  27. }
  28. }
  29. </span>

(5)RealData实现:

    1. <span style="font-size:18px;">package tgb;
    2. public class RealData implements Data {
    3. protected  String  result;
    4. public RealData(String para){
    5. //构造比较慢
    6. StringBuffer sb= new StringBuffer();
    7. for(int i=0;i<10;i++){
    8. sb.append(para);
    9. try{
    10. Thread.sleep(1000);
    11. }catch(Exception e){
    12. }
    13. result= sb.toString();
    14. }
    15. }
    16. @Override
    17. public String getResult() {
    18. return result;
    19. }
    20. }
    21. </span>

Future初次使用理解的更多相关文章

  1. Future、 CompletableFuture、ThreadPoolTaskExecutor简单实践

    一 Future(jdk5引入) 简介: Future接口是Java多线程Future模式的实现,可以来进行异步计算. 可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算 ...

  2. [netty4][netty-common]Future与Promise分析

    接口与类结构体系 -- [I]java.util.concurrent.Future<V> ---- [I]io.netty.util.concurrent.Future<V> ...

  3. 【搞定面试官】谈谈你对JDK中Executor的理解?

    ## 前言 随着当今处理器计算能力愈发强大,可用的核心数量越来越多,各个应用对其实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行.在此背景下,Java自JDK1.5 提供了自己的多线程框架 ...

  4. Java的Future接口

    Java的Future接口 Java 中的 Future 接口和其实现类 FutureTask,代表了异步计算的结果. 1. Future接口简介 Future 是异步计算结果的容器接口,它提供了下面 ...

  5. Apache Spark源码走读之6 -- 存储子系统分析

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk,本文尝试分析Spark中存储子系统的构成,并以数据写入和数 ...

  6. Pixel Recurrent Neural Networks翻译

    Pixel Recurrent Neural Networks 目前主要在用的文档存放: https://www.yuque.com/lart/papers/prnn github存档: https: ...

  7. 20155219 2016-2017-2 《Java程序设计》第7周学习总结

    20155219 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为 ...

  8. Tornado中gen.coroutine详解

    1.gen.coroutine的作用 自动执行生成器 2.Future对象 在介绍异步使用之前,先了解一下Future对象的作用. Future简单可以理解为一个占位符,将来会执行的对象,类似java ...

  9. 29_Future模式2_JDK内置实现

    [Future使用场景] Future表示一个可能未完成的一部任务的结果,针对这个结果可以添加CallBack,以便在任务执行成功或失败后作出相应的操作. Future模式非常适合在处理耗时很长的业务 ...

随机推荐

  1. winserver安装zabbixAgent

    zabbix 布署实践[8 监控windows server]   参考http://www.cnblogs.com/likehua/p/3968689.html的思路,我安装的是zabbix 3.0 ...

  2. [CSP-S模拟测试]:蛋糕(区间DP)

    题目传送门(内部题34) 输入格式 第一行,一个正整数$n$.第二行,$n$个正整数$a_i$,保证$a_i$互不相等. 输出格式 一行一个整数表示间宫卓司得到的蛋糕大小总和的最大值. 样例 样例输入 ...

  3. 前端每日实战:58# 视频演示如何用纯 CSS 创作一只卡通鹦鹉

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrRmWy 可交互视频 此视频是可 ...

  4. 百度上有个最难数独, 用python跑它

    直接上代码 #!/usr/bin/python3 #coding=GB2312 import tkinter as tk import threading import time import ran ...

  5. AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  6. TTL 与 CMOS

    Frm: https://blog.csdn.net/qq_27745395/article/details/76687175 http://baijiahao.baidu.com/s?id=1598 ...

  7. HBase 入门之数据刷写(Memstore Flush)详细说明

    接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系).HBase 写数据(比如 put.delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写 ...

  8. 【扩展lucas定理】

    洛谷模板题面:https://www.luogu.org/problemnew/show/P4720 扩展卢卡斯被用于解决模数为合数情形下的组合数问题. 首先我们把模数mod质因数分解,解决模每个素数 ...

  9. MySQL总结02

    sql优化 Insert使用批量 查询不要使用*, MySQ需要先查出表里的所有字段,再进行匹配 字符串的查询条件要带引号,否则可能不走索引 备份及恢复 备份 mysqldump -uroot -pp ...

  10. 常用命令--mount

    mount -o remount,rw / mount 命令 [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点 -l   查询系统中已经挂载的设备,-l 会显示卷标 -a ...