当我们调用一个方法的时候,这个方法可能会执行的很慢,常规的做法是,等待这个很慢的函数执行完成之后,再进行下一步的操作;

Future所应对的场景:当执行较慢的函数返回的结果并不是实时调用,而是随后再使用时,我们可以先通过Future模式,让其执行,真正使用时才去获取结果值,或者阻塞;

其中涉及到几个概念:

Main      系统的调用者,当前执行的主函数

Client     返回FutureData对象,开起新线程执行

Data       对应的获取数据的接口

FutureData   Future对象,很快的构造,能够通过该对象获取到真正的执行结果

RealData      真正的能够提供结果的对象,构造比较慢

简单实现:

public class Main {public static void main(String[] args) {Client client = new Client();//立即返回的不是真正的data,而是futuredata对象Data data = client.request();System.out.println("请求完毕");try {//模拟其他业务逻辑,在其他逻辑执行的过程中,realdata已经创建完成Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("真实的结果为: " + data.getResult());}
}
public class FutureData implements Data{protected RealData realData = null;protected boolean isReady = false;public synchronized void setRealData(RealData realData){if (isReady){return;}this.realData = realData;isReady = true;notifyAll();}@Overridepublic String getResult() {while (!isReady){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}return realData.getResult();}
}
public class RealData implements Data{protected final String result;public RealData(){try {//模拟创建时间很长的构造方法Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}result = "real data";}@Overridepublic String getResult() {return "return result";}
}
public interface Data {String getResult();
}
public class Client {public Data request(){final FutureData future = new FutureData();new Thread(() -> {RealData realData = new RealData();future.setRealData(realData);}).start();return future;}
}

JDK中的实现方法:

public class Realdata implements Callable<String> {@Overridepublic String call() throws Exception {Thread.sleep(1000);return "call result";}
}
public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<String> futureTask = new FutureTask<>(new Realdata());ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.submit(futureTask);//模拟其他逻辑执行时间,在此期间,futuretask已经执行完成Thread.sleep(2000);System.out.println("result is " + futureTask.get());}
}

jdk实现方便了我们的使用,只需要实现callable接口,并用futuretask提交到线程池执行即可;

并发模式之Future模式相关推荐

  1. 【并发编程】Future模式及JDK中的实现

    本文讲解Java中Future模式的使用,文章也发布在了公号(点击查看),欢迎交流. 1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执 ...

  2. JAVA 拾遗 --Future 模式与 Promise 模式

    JAVA 拾遗 --Future 模式与 Promise 模式 写这篇文章的动机,是缘起于微信闲聊群的一场讨论,粗略整理下,主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JA ...

  3. Future 模式与 Promise 模式

    这篇文章主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JAVA 中有 callback 调用吗? jdk 包中的 Future 怎么用? Future 模式和 Promise ...

  4. 【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  5. 并发程序设计模式之Future模式

    Future模式有点类似商品订单.比如在进行网上购物时,当看中某一件商品时,就可以提交订单.当订单处理完毕后,便可在家等待商品送货上门.卖家根据订单从仓库里取货,并配送到客户手上.在大部分情况下,商家 ...

  6. Future 模式详解(并发使用)

    我觉得很多讲Future模式的文章并没有深刻理解Future模式,其实Future模式只是生产者-消费者模型的扩展.经典"生产者-消费者"模型中消息的生产者不关心消费者何时处理完该 ...

  7. Java是如何实现Future模式的?万字详解!

    1 Future是什么? 先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们.在这一过程 ...

  8. 线程技术 ☞ Future模式

    线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...

  9. Swing中的并发-使用SwingWorker线程模式

    Swing中的并发-使用SwingWorker线程模式 原创作品http://zhangjunhd.blog.51cto.com/113473/34727 Blog: [url]http://zhan ...

最新文章

  1. SQL2008R2 express版本不支持维护计划
  2. javaweb乱码以及ajax乱码
  3. php mysql查询结果_php对mysql查询结果进行分页 - ceil
  4. linux shell 生产脚本汇总,【汇总】Linux常用脚本shell
  5. csr蓝牙适配 linux,Linux系统下蓝牙立体声配置A2DP profile
  6. 论文写作:如何选研究题目?
  7. 【安全牛学习笔记】cookie安全问题
  8. 推荐几个有特点的公众号给你
  9. 那些警示良言——老百姓也是圣贤
  10. 近地天体撞击地球原理的设想
  11. 云服务器怎么划分虚拟主机,云服务器 划分虚拟主机
  12. Communication-Efficient Federated Learning for Wireless Edge Intelligence in IoT
  13. 【无标题】C语言连续输出输入语句执行跳过的问题
  14. Extreme Picture Finder(网络图片下载器)官方中文版V3.53.3 | 下载网页图片的软件 | 图片助手批量图片下载器
  15. java 最大矩形_最大矩形面积
  16. Ubuntu 搜狗拼音安装详细步骤
  17. python读取文件夹下的文件名写入excel(高效办公)
  18. Python兼职有哪些?兼职月入5000+
  19. 基于BiGRU短期电力负荷预测方法
  20. 一款基于ssd1306驱动的12864屏简介

热门文章

  1. unknown host www.baidu.com 解决方法
  2. 解决visual studio换行(回车键)不能代码补全问题
  3. weblogic启动后,抛出大量的java.lang.ArrayIndexOutOfBoundsException异常
  4. 阿里云服务器安装python3.7.3,解决openssl问题
  5. 为什么setTimeout(fn,0)有时有用?
  6. win11组策略如何恢复默认设置 windows11组策略恢复默认设置的步骤方法
  7. java逻辑判断_阿里JAVA开发强制要求的10条条件控制及逻辑判断的规范,切记
  8. MTK 10A常用函数集锦
  9. 数据库用户管理(增删改查,即CRUD)
  10. JavaScript获取验证码,60秒倒计时方法