java - Clojure实现带超时的 future vector

标签 java asynchronous clojure completable-future

我正在与返回 CompletableFuture 的 Java API 交互。 现在,如果我有这些 [cf1 cf2 cf3 …] 的数组,我如何给它们 all 一秒钟的时间来完成,并在一秒钟后收集它们产生的所有内容?

类似于:

  (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 (?)。

最佳答案

您可能会使用 CompletableFuture.allOf为了获得一个可完成的 future ,您可以阻塞等待所有任务完成或超时所需的时间(因此等待时间可能比超时时间短 - 所有任务最多一秒,不一定在一秒后)然后迭代如果完成,则在原始 future 上获得它们的值(value):

(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 %))))

关于java - Clojure实现带超时的 future vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47379054/

相关文章:

javascript - 一旦第三方脚本加载失败,立即运行一段 JavaScript

java - 如何在jshell中使用Lombok?

java - 解释Jsoup中NodeVisitor接口(interface)的head和tail方法

python - 异步登录 Tornado

.net - 不调用 Delegate.EndInvoke 会导致内存泄漏......一个神话?

performance - 如何着手编写核心函数,而不是使用命令式风格?

java - 创建一个文本文件,然后将打印到 REPL 的内容写入文本文件

events - 拉米纳 vs Storm

java - Java 8 中的拆分和循环

java - 如何使用 Cglib 在运行时通过读取 XML 配置来更新类的字段?