一 .入门

相信大家使用过线程,对future应该不会陌生吧! 在java一种最简单的使用是Callable,比如:

public class A implements Callable<String> {@Override
    public String call() throws Exception {return "aaa";}
}
@org.junit.Test
public void test3() throws ExecutionException, InterruptedException {ExecutorService service = Executors.newSingleThreadExecutor();Future<String> restult = service.submit(new A());System.out.println(restult.get());
}

这样结果就输出了

aaa

很简单吧,现在来简单讲解下future的使用。

二. 理解future

future模式是一种异步获取结果的方式

public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);  //任务取消boolean isCancelled();  //判断是否取消boolean isDone();  //是否已经做完V get() throws InterruptedException, ExecutionException;  //获取值V get(long timeout, TimeUnit unit)   //带超时的获取值throws InterruptedException, ExecutionException, TimeoutException;
}

feture的使用一般使用线程池来获取值。

现在来简单梳理一下调用逻辑

线程池一般都会继承ExecutorService,最终会执行到ThreadPoolExecutor的execute方法,之后利用BlockingQueue来获取值。它里面用的是Condition的await和signal方法。由于对象的await和notify方法和它们类似。那本篇主要使用await和notify来实现future的功能。

三.future 代码实现

public interface IData {  //定义数据接口RealData getResult();
}
public class RealData implements IData {  //定义private String data;  public RealData(String name) {try {TimeUnit.SECONDS.sleep(2);  //模仿耗时操作} catch (InterruptedException e) {e.printStackTrace();}data = "init finish!" + name;  //赋值}@Override
    public RealData getResult() {return this;}public String getData() {  //返回最后添加的值return data;  }
}
public class FutureData implements IData {  //futureData 实现类private RealData realData = null;  public void setRealData(RealData realData) {this.realData = realData;synchronized (this) {  //同步代码块notifyAll();  //通知所有阻塞线程}System.out.println("值设置成功!");}@Override
    public RealData getResult() {try {synchronized (this) { //同步代码块wait();           // 阻塞,如果值执行完,由notify唤醒}} catch (InterruptedException e) {e.printStackTrace();}return realData;}}
public class FutureClint {public FutureData init(String result) {  //使用线程的方式初始化值FutureData futureData = new FutureData();new Thread(new Runnable() {@Override
            public void run() {RealData realData = new RealData("result");futureData.setRealData(realData);}}).start();return futureData;  //这里是异步返回的}
}
@org.junit.Test
public void futureDataTest() throws InterruptedException {FutureClint futureClint = new FutureClint();FutureData data = futureClint.init("future test");System.out.println("get data");  System.out.println("result:"+data.getResult().getData());
}

结果

get data     //这里结果输出之后应该会等2秒,
值设置成功!
result:init finish!result  //异步通知,这里的值会输出

四.总结

需要使用到对象的await和notify方法,以及线程,实现方法有点类似静态代理模式,又有点策略模式的影子。先需要初始化一个真实的对象,然后在线程里面讲这个对象赋值给future对象,这样就可以直接返回future对象,在输出future对象的属性值时,需要通知当前阻塞的线程往下执行!

future的简单实现相关推荐

  1. vert.x中future的简单使用

    文章目录 需要知道vert.x的基础知识,和vertx单侧方式 初始化: future完成(成功或者失败(异常)) 设置回调 举例 tryComplete方法 map的使用 compose方法,最后讲 ...

  2. Callable与Future的简单介绍

    Callable与Future的介绍 Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类 ...

  3. Java高并发编程:Callable、Future和FutureTask

    1. Callable 泛型接口,用于获取线程执行完的结果,Callable的声明如下 public interface Callable<V> {// 返回 V 类型的结果V call( ...

  4. folly教程系列之:future/promise

         attension:本文严禁转载. 一.前言 promise/future是一个非常重要的异步编程模型,它可以让我们摆脱传统的回调陷阱,从而使用更加优雅.清晰的方式进行异步编程.c++11中 ...

  5. C++function,future,packaged_task

    1.function和bind 这两个函数需要包含头文件#inlude<functional>. std::function是一种封装函数的工具或者说方法.std::function封装包 ...

  6. 【转】现代c++开发利器folly教程系列之:future/promise

    一.前言 promise/future是一个非常重要的异步编程模型,它可以让我们摆脱传统的回调陷阱,从而使用更加优雅.清晰的方式进行异步编程.c++11中已经开始支持std::future/std:: ...

  7. 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)

    一.前言 1.最早我是从微信公众号看到这篇文章的,了解到开源项目ananas(A C++11/golang protobuf RPC framework)实现了Linux高性能网络库和rpc功能,里面 ...

  8. C++ 并发指南< future >(3)std::future std::shared_future

    std::future介绍 简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段. std::future 通常由某个 Provider 创建,你可 ...

  9. 保研计算机英语词汇,简单的英语自我介绍保研面试

    下面是小编收集整理的简单的保研面试英语自我介绍范文,欢迎大家阅读参考! 简单的保研面试英语自我介绍范文[1] I am deeply impressed by the academic atmosph ...

最新文章

  1. 深入理解Java虚拟机——第二章——Java内存区域与内存溢出异常
  2. 项目进度管理和项目成本管理作业
  3. Javascript中的prototype
  4. iPhone与Android手机 各个型号的UserAgent
  5. 问题之sqlyou的使用
  6. 三个数差的平方公式推导过程_勾股数公式的简单推导
  7. Silverlight Telerik控件学习:主题Theme切换
  8. iOS开发之阿里百川、京东联盟、多多客联盟(拼多多)的接入
  9. Apache Drill
  10. c语言 防止sql注入,c#如何防止sql注入?
  11. python实战—考勤报表数据分析处理
  12. 沃尔什矩阵_大卫·沃尔什(David Walsh):失落的MooTools插件
  13. ECC椭圆曲线算法(1)阿贝尔群
  14. 推荐一首歌 《老男孩》
  15. 2022制冷与空调设备运行操作考试模拟100题模拟考试平台操作
  16. flstudio软件怎么设置中文语言切换?
  17. Apollo学习(二)appollo安装与部署
  18. 权限和归属——基本权限和特殊权限
  19. 如何使用ArcGIS绘制经纬网
  20. Tensorflow-Caffe学习之路(一)Windows Anaconda3安装Caffe环境

热门文章

  1. 惠普台式计算机BIOS密码设置,惠普电脑开机bios密码忘了怎么解决
  2. ceph L版本相对于J版本在scrub机制上做的优化
  3. lamda函数的简介
  4. JS中的函数声明和函数表达式
  5. 用glRotatef函数转动对象
  6. Java 获取当前年,前几年(之前年),后几年(之后年)
  7. 基于springboot+vue个人博客搭建
  8. 2021朋友圈都在传的10本书,找到了
  9. java的行业认证_Sun认证Java程序员考试介绍
  10. DRN: A Deep Reinforcement Learning Framework for News Recommendation学习