JAVA 异步编程之 FUTURE

Future 的概念

Future 设计初衷是对将来某讴歌时刻会发生的结果建模,保存了一个直接预期的引用。
Future 可以取消, Future.get() 方法是阻塞式的。

Future 模型解决了一部分异步引用问题,但是并没有解决全部的异步问题,有以下局限性:

  1. 无法将两个异步结果合并为一个(不能直接合并)
  2. 无法简单等待 Future 集合中所有任务完成
  3. 无法等待 Future 集合中最快任务完成
  4. 无法设置 Future 结果的回调方法
  5. 无法通过编程的方式完成一个 Future 任务的执行

CompletableFuture

CompletableFuture 实现 Future 接口,并解决了以上问题。
CompletableFuture与Stream的设计都遵循了类似的设计模式:使用Lambda表达式以及流水线的思想,从这个角度可以说CompletableFuture与Future的关系类似于Stream与Collection的关系。

选择正确的线程池大小:

Number = NCpu * Ucpu * ( 1 + W/C)
Number : 线程数量
NCpu : 处理器核数
UCpu : 期望cpu利用率
W/C : 等待时间与计算时间比

并行流与CompletableFuture

目前,我们对集合进行计算有两种方式:1.并行流 2.CompletableFuture;而CompletableFuture更加的灵活,我们可以配置线程池的大小确保整体的计算不会因为等待IO而发生阻塞。
书上给出的建议如下:

如果是计算密集型的操作并且没有IO推荐stream接口,因为实现简单效率也高,如果所有的线程都是计算密集型的也就没有必要创建比核数更多的线程。
反之,如果任务涉及到IO,网络等操作:CompletableFuture灵活性更好,因为大部分线程处于等待状态,需要让他们更加忙碌,并且再逻辑中加入异常处理可以更有效的监控是什么原因触发了等待。

猜你喜欢

转载自juejin.im/post/5eaf73586fb9a0433e52bcfe