为什么CompletableFuture allOf方法会执行二进制搜索?

时间:2019-08-06 10:45:32

标签: java concurrency completable-future

我想知道allOf的{​​{1}}方法是否进行轮询或进入等待状态,直到传递给该方法的所有CompletableFuture完成执行。 我查看了CompletableFuturesallOf方法的代码,它正在执行某种二进制搜索。

请帮助我找出IntelliJ的{​​{1}}方法的实际作用。

allOf

1 个答案:

答案 0 :(得分:6)

它不进行二分查找-它正在构建平衡二叉树,其输入期货位于叶子上,并且内部节点在两个子节点都完成时都完成。 >

出于某种原因(从代码中看不出来),代码的作者必须决定,将正好两个期货之间的allOf(_,_)视为原始操作,以及是否要求{ {1}}在两个以上的期货之间,他将其制造为这些二进制基元的级联。

树应该平衡,以使无论最后完成的未来是什么,在顶层的未来完成之前,只有少量的层次要崩溃。在某些情况下,这可以提高性能,因为它可以确保在我们完全完成之前 可以处理尽可能多的工作,这时(如果幸运的话)空闲,等待异步完成。

通过在 top 内部节点的左子节点下和右子节点下有大约一样多的叶子来平衡树-因此两个子节点都得到原始数组的一半左右,然后该代码以递归方式从数组的每一半构建一棵树。分成两半看起来有点像二进制搜索的索引计算。


基本结构被似乎旨在用于以下目的的特殊情况稍微掩盖了

  • 在某些原始期货已经完成后,使用分配较少的优化代码路径,并且
  • 确保具有完全 one 元素的allOf(...)的结果将返回 fresh allOf(_)。在大多数情况下,返回单个元素是可行的,但是作者必须要确保该库的用户可以使用新鲜的对象(如果他们将它们用作哈希映射或其他依赖于逻辑的键)能够分辨输入的输出,并且
  • 通过使用CompleteableFuture和内联分配,而不是诚实的throw new NullPointerException();语句,
  • 只有一个?:。该可能会产生稍小的字节码,但会降低可读性。除非您亲自支付所得字节码的存储费用,否则不建议将其推荐为学习的方式。