Java 并发(Future 模式)
>Future 提前完成任务
首先,梳理一下,多线程为我们带来什么:
- 充分利用CPU
- 当我们需要并行处理一件任务(并不一定是为了提高运算速度,而且很多时候性能并不是绝对的问题,同一时间需要处理多个任务,就要开线程)
Future,未来,什么是未来?
设想一种情景,线程等待生产产品的时候,想做点其他的事情
产品:
public class Product {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Product [id=" + id + ", name=" + name + "]";}public Product() {}public Product(int id, String name) {this.id = id;this.name = name;new Thread(new Runnable() {@Overridepublic void run() {try {// 模拟产品生产过程Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}
}
生产工厂:
public class ProductFactory {public Product buildProduct() {return new Product();}
}
测试线程:
public class Go {public static void main(String[] args) {ProductFactory pf=new ProductFactory();System.out.println("准备生产产品");Product product = pf.buildProduct();System.out.println("生产产品的时候,我想干点别的...");System.out.println("产品生产完毕"+product);}
}
结果:
准备生产产品
生产产品的时候,我想干点别的...
产品生产完毕Product [id=1, name=tea]
上面的代码的问题?
首先,为了模拟产品构建比较慢,我们使用Thread.sleep(),然后我们将Thread.sleep() 又放到了一个线程中,这是一种错误的代码,真正模拟生产产品,也就是初始化赋值的代码并没有办法拿到线程里面;
如果不能开线程,那么在真正产品生产结束之前,线程真就不能干点别的。
另外,在构造函数中不能开线程,会造成This 逃逸现象(在对象构造完成之前,就发布了引用)。
再来,新问题:
如果现在要去蛋糕店定做一个蛋糕,蛋糕制作期间,想先处理下其他事情,先拿到订单,做好之后再拿到实际的蛋糕
建立模型:
为什么要设计成这个样子,首先找老板要定做一个蛋糕,需要一个返回值,老板一开始只能给我一个订单,蛋糕和订单 并不是同一个类型,所以要同时继承一个接口/共同继承一个类,这样满足类之间的多态。
其中订单中对蛋糕存在一种包装,存在依赖关系,真正干活的还得是Real。
之前你拿蛋糕是直接在那等着做好了,直接拿蛋糕,现在有了这层 “订单包装”之后,既方便“老板”先给你一个订单,然后开线程把一个未完成的“订单”完成,同时你去做其他事情,也可以通过“订单”这个包装来控制:
- 蛋糕未做完之前,来取就得等待,等做好了就通知你取“蛋糕”。
- 蛋糕做好之后来取,直接就可以获得蛋糕。
/*** 数据访问接口*/
public interface Data {public String obtainString();
}
/*** 类似于产品 实际数据 "蛋糕"*/
public class Real implements Data {public Real() {try {//模拟产品生产过程Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic String obtainString() {//一旦可以调用返回,即代表产品生产完成return "hello world";}
}
/*** 可以理解为 "订单"*/
public class Future implements Data {private Real real;private boolean ready = false;public synchronized void setReal(Real real) {if (ready) {return;}this.real = real;this.ready = true;notifyAll();}@Overridepublic synchronized String obtainString() {if (!ready) {try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return real.obtainString();}
}
/*** 返回Data对象 可以理解为 "蛋糕店"*/
public class RequestHandler {public Data requestData() {final Future future = new Future();//开了一个线程去 做"蛋糕",可以想象这个线程需要运行一段时间new Thread(new Runnable() {@Overridepublic void run() {Real real = new Real();future.setReal(real);}}).start();//先给你一个订单return future;}
}
public class Go {public static void main(String[] args) throws InterruptedException {RequestHandler handler = new RequestHandler();//这里向"老板"handler 请求做蛋糕 ,拿到订单Data data1 = handler.requestData();Data data2 = handler.requestData();/*** 这里我们可以做其他事情,而不是等待*/System.out.println("我在做其他事情...");// Thread.sleep(3000);System.out.println(data1.obtainString());System.out.println(data2.obtainString());}
}
Java 并发(Future 模式)相关推荐
- 彻底理解Java的Future模式
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/81074477 先上一个场景:假如你突然想做 ...
- JAVA 拾遗 --Future 模式与 Promise 模式
JAVA 拾遗 --Future 模式与 Promise 模式 写这篇文章的动机,是缘起于微信闲聊群的一场讨论,粗略整理下,主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JA ...
- 【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- JAVA并发-Future/CompletableFuture
文章目录 一.Future 1. 什么是Future 2. future如何使用 2.1 FutureTask 工具类 3. Future 接口的局限性 二.CompletableFuture 1. ...
- Java并发Future
一.简介 ThreadPoolExecutor线程池获取任务执行结果,用到Future可以实现. 二.获取执行结果 Java通过ThreadPoolExecutor 提供3个submit()方法和1个 ...
- 【并发编程】Future模式及JDK中的实现
本文讲解Java中Future模式的使用,文章也发布在了公号(点击查看),欢迎交流. 1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执 ...
- java并发编程Future类详解
作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时 ...
- [Java并发-14] Future: 优雅的使用多线程
上一篇,我们详细介绍了如何创建正确的线程池,那创建完线程池,我们该如何使用呢?在上一篇文章中,我们仅仅介绍了 ThreadPoolExecutor 的 void execute(Runnable co ...
- Java Future接口、Future模式理解
原文地址:https://blog.csdn.net/devinteng/article/details/23455733 Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时 ...
- 彻底理解Java的feature模式
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...
最新文章
- 【思科】BGP的community属性解析
- 企业网络高级技术第二章STP实验
- Raspberry Pi 4B 同步控制两个舵机 实现颜色跟踪
- 用Apache的HTACCESS保护密码
- RN返回navigation方法
- C语言标准时间与日期函数
- 哈希表的key的类型(传值与传引用)
- Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)
- C++笔记(3)——string.h相关的一些小知识
- mysql isnull
- ai训练 样本大小_防止过拟合(三):数据增强(增加训练样本)
- python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行
- Linux知识--初始linux
- Flex里[Exclude]标签的作用:对外忽略/隐藏内部某对象
- python2打印字符串_Python 3基础教程2-打印语句和字符串
- 网站项目常用JS,CSS等控件插件
- 验证码识别登录:使用超级鹰(验证码识别第三方包)识别超级鹰网站登录
- 淘宝价格带卡位公式是什么?如何定价?
- Rollup-前端模块化打包工具入门
- 分数阶傅立叶变换 matlab,【综述】分数阶傅里叶变换(FRFT)