我想知道allOf
的{{1}}方法是否进行轮询或进入等待状态,直到传递给该方法的所有CompletableFuture
完成执行。
我查看了CompletableFutures
中allOf
方法的代码,它正在执行某种二进制搜索。
请帮助我找出IntelliJ
的{{1}}方法的实际作用。
allOf
答案 0 :(得分:6)
它不进行二分查找-它正在构建平衡二叉树,其输入期货位于叶子上,并且内部节点在两个子节点都完成时都完成。 >
出于某种原因(从代码中看不出来),代码的作者必须决定,将正好两个期货之间的allOf(_,_)
视为原始操作,以及是否要求{ {1}}在两个以上的期货之间,他将其制造为这些二进制基元的级联。
树应该平衡,以使无论最后完成的未来是什么,在顶层的未来完成之前,只有少量的层次要崩溃。在某些情况下,这可以提高性能,因为它可以确保在我们完全完成之前 可以处理尽可能多的工作,这时(如果幸运的话)空闲,等待异步完成。
通过在 top 内部节点的左子节点下和右子节点下有大约一样多的叶子来平衡树-因此两个子节点都得到原始数组的一半左右,然后该代码以递归方式从数组的每一半构建一棵树。分成两半看起来有点像二进制搜索的索引计算。
基本结构被似乎旨在用于以下目的的特殊情况稍微掩盖了
allOf(...)
的结果将返回 fresh allOf(_)
。在大多数情况下,返回单个元素是可行的,但是作者必须要确保该库的用户可以使用新鲜的对象(如果他们将它们用作哈希映射或其他依赖于逻辑的键)能够分辨输入的输出,并且CompleteableFuture
和内联分配,而不是诚实的throw new NullPointerException();
语句,?:
。该可能会产生稍小的字节码,但会降低可读性。除非您亲自支付所得字节码的存储费用,否则不建议将其推荐为学习的方式。