并发模式之Future模式
当我们调用一个方法的时候,这个方法可能会执行的很慢,常规的做法是,等待这个很慢的函数执行完成之后,再进行下一步的操作;
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模式相关推荐
- 【并发编程】Future模式及JDK中的实现
本文讲解Java中Future模式的使用,文章也发布在了公号(点击查看),欢迎交流. 1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执 ...
- JAVA 拾遗 --Future 模式与 Promise 模式
JAVA 拾遗 --Future 模式与 Promise 模式 写这篇文章的动机,是缘起于微信闲聊群的一场讨论,粗略整理下,主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JA ...
- Future 模式与 Promise 模式
这篇文章主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JAVA 中有 callback 调用吗? jdk 包中的 Future 怎么用? Future 模式和 Promise ...
- 【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- 并发程序设计模式之Future模式
Future模式有点类似商品订单.比如在进行网上购物时,当看中某一件商品时,就可以提交订单.当订单处理完毕后,便可在家等待商品送货上门.卖家根据订单从仓库里取货,并配送到客户手上.在大部分情况下,商家 ...
- Future 模式详解(并发使用)
我觉得很多讲Future模式的文章并没有深刻理解Future模式,其实Future模式只是生产者-消费者模型的扩展.经典"生产者-消费者"模型中消息的生产者不关心消费者何时处理完该 ...
- Java是如何实现Future模式的?万字详解!
1 Future是什么? 先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们.在这一过程 ...
- 线程技术 ☞ Future模式
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...
- Swing中的并发-使用SwingWorker线程模式
Swing中的并发-使用SwingWorker线程模式 原创作品http://zhangjunhd.blog.51cto.com/113473/34727 Blog: [url]http://zhan ...
最新文章
- SQL2008R2 express版本不支持维护计划
- javaweb乱码以及ajax乱码
- php mysql查询结果_php对mysql查询结果进行分页 - ceil
- linux shell 生产脚本汇总,【汇总】Linux常用脚本shell
- csr蓝牙适配 linux,Linux系统下蓝牙立体声配置A2DP profile
- 论文写作:如何选研究题目?
- 【安全牛学习笔记】cookie安全问题
- 推荐几个有特点的公众号给你
- 那些警示良言——老百姓也是圣贤
- 近地天体撞击地球原理的设想
- 云服务器怎么划分虚拟主机,云服务器 划分虚拟主机
- Communication-Efficient Federated Learning for Wireless Edge Intelligence in IoT
- 【无标题】C语言连续输出输入语句执行跳过的问题
- Extreme Picture Finder(网络图片下载器)官方中文版V3.53.3 | 下载网页图片的软件 | 图片助手批量图片下载器
- java 最大矩形_最大矩形面积
- Ubuntu 搜狗拼音安装详细步骤
- python读取文件夹下的文件名写入excel(高效办公)
- Python兼职有哪些?兼职月入5000+
- 基于BiGRU短期电力负荷预测方法
- 一款基于ssd1306驱动的12864屏简介
热门文章
- unknown host www.baidu.com 解决方法
- 解决visual studio换行(回车键)不能代码补全问题
- weblogic启动后,抛出大量的java.lang.ArrayIndexOutOfBoundsException异常
- 阿里云服务器安装python3.7.3,解决openssl问题
- 为什么setTimeout(fn,0)有时有用?
- win11组策略如何恢复默认设置 windows11组策略恢复默认设置的步骤方法
- java逻辑判断_阿里JAVA开发强制要求的10条条件控制及逻辑判断的规范,切记
- MTK 10A常用函数集锦
- 数据库用户管理(增删改查,即CRUD)
- JavaScript获取验证码,60秒倒计时方法