1. CompletableFutureJava8新增的一个超大型工具类,为什么说她大呢?因为一方面它实现了Future接口,更重要的是,它实现了CompletionStage接口.这个接口也是Java8新增加的,而CompletionStage拥有多达约40种方法,
  2.  
  3. * 完成了通知我
  4. * 异步执行任务
  5.  
  6. 通过CompletableFuture提供进一步封装,我们很容易实现Future模式那样的异步调用,例如:
  7. public static Integer cale(Integer para) {
  8. try {
  9. Thread.sleep(1000);
  10.  
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. return para * para;
  15. }
  16. public static void main(String[] args) throws ExecutionException, InterruptedException {
  17.  
  18. CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> cale(50));
  19. System.out.println(future.get());
  20. }
  21.  
  22. 上述代码中CompletableFuture.supplyAsync()方法构造了一个CompletableFuture实例,在supplyAsync()函数中,他会在一个新的线程中,执行传入的参数.在这里,,他会执行calc()方法,而calc()方法的执行可能是比较慢的,但是不影响CompletableFuture实例的构造速度,因此supplyAsync()会立即返回,他返回的CompletableFuture对象实例就可以作为这次调用的契约,在将来任何场合,用于获得最终的计算结果.
  23. CompletableFuture中,类似的工厂方法有以下几个:
  24. public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
  25. public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
  26. Executor executor)
  27. public static CompletableFuture<Void> runAsync(Runnable runnable)
  28. public static CompletableFuture<Void> runAsync(Runnable runnable,
  29. Executor executor)
  30.  
  31. 其中supplyAsync()方法用于那些需要返回值的场景,比如计算某个数据,而runAsync()方法用于没有返回值的场景,比如,仅仅是简单地执行某一个异步动作.
  32. 在这两对方法中,都有一个方法可以接手一个Executor参数,这使我们可以让Supplier<U>或者Runnable在指定的线程池工作,如果不指定,则在默认的系统公共的ForkJoinPool.common线程池中执行.
  33.  
  34. * 流式调用
  35.  
  36. 在前文中我已经简单的提到,CompletionStage的约40个接口为函数式编程做准备的,在这里,就让我们看一下,如果使用这些接口进行函数式的流式API调用:
  37. CompletableFuture<Void> future = CompletableFuture
  38. .supplyAsync(() -> cale(50))
  39. .thenApply(i -> Integer.toString(i))
  40. .thenApply(str -> "\"" + str + "\"")
  41. .thenAccept(System.out::println);
  42. future.get();
  43.  
  44. 上述代码中,使用supplyAsync()函数执行了一个异步任务,接着连续使用流式调用对任务处理结果进行在加工,直到最后的结果输出:
  45.  
  46. * CompletableFuture中的异常处理
  47.  
  48. CompletableFuture<Void> future = CompletableFuture
  49. .supplyAsync(() -> cale(50))
  50. .exceptionally(ex -> {
  51. System.out.println("ex.toString() = " + ex.toString());
  52. return 0;
  53. })
  54. .thenApply(i -> Integer.toString(i))
  55. .thenApply(str -> "\"" + str + "\"")
  56. .thenAccept(System.out::println);
  57. future.get();
  58.  
  59. * 组合多个CompletableFuture
  60.  
  61. CompletableFuture还允许你将多个CompletableFuture进行组合,一种方法是使用thenCompose(),它的签名如下:
  62. public <U> CompletableFuture<U> thenCompose(
  63. Function<? super T, ? extends CompletionStage<U>> fn)
  64.  
  65. 一个CompletableFuture可以执行完成后,将执行结果通过Function传递给下一个CompletionStage进行处理:
  66.  
  67. CompletableFuture<Void> future = CompletableFuture
  68. .supplyAsync(() -> cale(50))
  69. .thenCompose(i -> CompletableFuture
  70. .supplyAsync(() -> cale(i)))
  71. .thenApply(i -> Integer.toString(i))
  72. .thenApply(str -> "\"" + str + "\"")
  73. .thenAccept(System.out::println);
  74. future.get();
  75.  
  76. 另外一种组和多个CompletableFuture的方法是thenCombine(),它的签名如下:
  77. public <U,V> CompletableFuture<V> thenCombine(
  78. CompletionStage<? extends U> other,
  79. BiFunction<? super T,? super U,? extends V> fn)
  80.  
  81. 方法thenCombine()首先完成当前CompletableFutureother的执行,接着,将这两者的执行结果传递给BiFunction(该接口接受两个参数,并有一个返回值),并返回代表BiFuntion实例的CompletableFuture对象:
  82. CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> cale(50));
  83. CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> cale(25));
  84.  
  85. CompletableFuture<Void> fu = future1.thenCombine(future2, (i, j) -> (i + j))
  86. .thenApply(str -> "\"" + str + "\"")
  87. .thenAccept(System.out::println);
  88. fu.get();

  

Java8 增强的Future:CompletableFuture(笔记)的更多相关文章

  1. Java8 异步编排类CompletableFuture

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. https://www.cnblogs.com/shijiaqi1066/p/8758206 ...

  2. 8.2.2 使用Java8增强的Iterator遍历集合元素

    8.2.2 使用Java 8增强的Iterator遍历集合元素 Iterator接口方法 程序示例 Iterator仅用于遍历集合 Iterator必须依附于Collection对象 修改迭代变量的值 ...

  3. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  4. java8 学习系列--NIO学习笔记

    近期有点时间,决定学习下java8相关的内容: 当然了不止java8中新增的功能点,整个JDK都需要自己研究的,不过这是个漫长的过程吧,以自己的惰性来看: 不过开发中不是有时候讲究模块化开发么,那么我 ...

  5. Java8增强的包装类

    为了解决8中基本数据类型的变量不能当成Object 类型变量使用的问题,Java提供了包装类的概念,为8种基本数据类型分别定义了相应的引用类型,并称为基本数据类型的包装类. JDK 1.5提供了自动装 ...

  6. Future复习笔记

    1. Future就是对于具体的Runnable或者Callable任务的执行结果进行取消.查询是否完成.获取结果.必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果. Future类 ...

  7. Java8增强的Map集合

    Map集合简介 Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的vlaue,key和value都可以是任何引用类型的数据. M ...

  8. java8 增强的Iterator遍历集合元素

    Iterator接口也是Java集合框架的成员,与Collection和Map两个系列的集合不一样的是Collection和Map系列主要用于充当容器的作用,而Iterator正如其名字一样是主要用于 ...

  9. 《实战Java高并发程序设计》读书笔记

    文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2. ...

随机推荐

  1. MYSQL使用外键进行优化

    #转载请联系 假如你是京东的数据库管理员,你现在管理着这样一个数据库. mysql> select * from goods; +----+--------------------------- ...

  2. CDN缓存(转载)

    CDN缓存那些事(转载) 原文地址:http://bbs.qcloud.com/forum.php?mod=viewthread&tid=3775 注:原文全文复制,仅仅作为自己下次学习备份, ...

  3. python算法:嵌套数组转变成一维数组

    比如,输入是:[2, 1, [3, [4, 5], 6], 7, [8]] 则,输出是:[2, 1, 3, 4, 5, 6, 7, 8] def list_flatten(l, a=None): a ...

  4. Activiti 6.0 入门篇

    从Activiti网站下载Activiti UI WAR文件(或百度云) 将下载的activiti-app.war复制到Tomcat的webapps目录. 启动Tomcat 打开浏览器并转到 http ...

  5. redis基础配置

    特点 redis是高性能的key-value的数据库,其支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时再次加载使用:具有丰富的数据类型支持,例如list, set, zset, hash等: ...

  6. configure.ac中AC_CHECK_LIB的问题

    编译Linux程序时,使用configure.ac生成的configure程序,时常会出现AC_CHECK_LIB检查某个库失败 而相应库通常是存在的,只是依赖于其他的库,此时,需要乃至AC_CHEC ...

  7. [bootstrap] 修改字体

    file: variable.less @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-seri ...

  8. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

  9. CF A.Mishka and Contest【双指针/模拟】

    [链接]:CF/4892 [题意]: 一个人解决n个问题,这个问题的值比k小, 每次只能解决最左边的或者最右边的问题 解决了就消失了.问这个人能解决多少个问题. [代码]: #include<b ...

  10. 有向图强连通分量的Tarjan算法及模板

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...