我正在与返回CompletableFuture
的Java API进行交互。
现在,如果我有一个这些[cf1 cf2 cf3 …]
的数组,我怎样才能让他们所有一秒钟完成,并收集他们在一秒钟后产生的一切?
类似的东西:
(def vec-of-cf [cf1 cf2 cf3])
(get-all vec-of-cf 1000 ::timeout)
;; no more than 1 second later, I should have my vector of realized CompletableFuture, possibly holding a `::timeout` value if they did not have time to finish
我认为这类似于Scala flatmap
(?)。
答案 0 :(得分:5)
您可以使用CompletableFuture.allOf
来获取可以阻止的单个可完成的未来,只要等待所有这些完成或超时所需的时间(因此可能等待超过超时 - 所有任务最多为1第二,不一定在一秒之后)然后迭代原始期货以获得它们的价值,如果它们已经完成:
(def vec-of-cf [cf1 cf2 cf3])
(let [all-of (CompletableFuture/allOf (into-array vec-of-cf))]
(try
(.get all-of timeout)
(catch java.util.concurrent.TimeoutException e))
(->> vec-of-cf
(filter #(.isDone %))
(map #(.get %))))
答案 1 :(得分:1)
这样的事情应该有效:
(defn get-all [vec-of-cf timeout timeout-val]
(Thread/sleep timeout)
(mapv #(if (future-done? %) (deref %) timeout-val) vec-of-cf))
此代码也可以修改为取消未完成的未来(如果需要)