>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 模式)相关推荐

  1. 彻底理解Java的Future模式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/81074477 先上一个场景:假如你突然想做 ...

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

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

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

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

  4. JAVA并发-Future/CompletableFuture

    文章目录 一.Future 1. 什么是Future 2. future如何使用 2.1 FutureTask 工具类 3. Future 接口的局限性 二.CompletableFuture 1. ...

  5. Java并发Future

    一.简介 ThreadPoolExecutor线程池获取任务执行结果,用到Future可以实现. 二.获取执行结果 Java通过ThreadPoolExecutor 提供3个submit()方法和1个 ...

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

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

  7. java并发编程Future类详解

    作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时 ...

  8. [Java并发-14] Future: 优雅的使用多线程

    上一篇,我们详细介绍了如何创建正确的线程池,那创建完线程池,我们该如何使用呢?在上一篇文章中,我们仅仅介绍了 ThreadPoolExecutor 的 void execute(Runnable co ...

  9. Java Future接口、Future模式理解

    原文地址:https://blog.csdn.net/devinteng/article/details/23455733 Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时 ...

  10. 彻底理解Java的feature模式

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

最新文章

  1. 【思科】BGP的community属性解析
  2. 企业网络高级技术第二章STP实验
  3. Raspberry Pi 4B 同步控制两个舵机 实现颜色跟踪
  4. 用Apache的HTACCESS保护密码
  5. RN返回navigation方法
  6. C语言标准时间与日期函数
  7. 哈希表的key的类型(传值与传引用)
  8. Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)
  9. C++笔记(3)——string.h相关的一些小知识
  10. mysql isnull
  11. ai训练 样本大小_防止过拟合(三):数据增强(增加训练样本)
  12. python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行
  13. Linux知识--初始linux
  14. Flex里[Exclude]标签的作用:对外忽略/隐藏内部某对象
  15. python2打印字符串_Python 3基础教程2-打印语句和字符串
  16. 网站项目常用JS,CSS等控件插件
  17. 验证码识别登录:使用超级鹰(验证码识别第三方包)识别超级鹰网站登录
  18. 淘宝价格带卡位公式是什么?如何定价?
  19. Rollup-前端模块化打包工具入门
  20. 分数阶傅立叶变换 matlab,【综述】分数阶傅里叶变换(FRFT)

热门文章

  1. java实现winpcap_基于winpcap的ARP发送程序
  2. 深入理解@Autowired注解
  3. 在字典中根据条件来筛选数据
  4. Selenium学习(2) 元素定位
  5. spring boot入门学习---热部署
  6. 6.10. stack-manager
  7. PHPCMS修改目录
  8. context.Request.Files post 上传问题件
  9. 网络安装archlinux(2012.8.20)笔记
  10. uva 10594(最小费用最大流)