2017-11-19 4 views
1

私はCompletableFutureを返すJava APIとインターフェースしています。 ここに[cf1 cf2 cf3 …]の配列がある場合、どうすればすべてに完了し、1秒後に何を生産したのかを収集できますか? (?)私は、これはScalaのflatmapに似ていると思うClojureはタイムアウトのある先物のベクトルを実現します

(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 

:よう

何か。

答えて

5

を終了していない未来をキャンセルするように変更することができすべてのタスクが完了したりタイムアウトしたりするのを待つだけです(タイムアウトよりも短く、すべてのタスクを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

このような何か作業をする必要があります:

(defn get-all [vec-of-cf timeout timeout-val] 
(Thread/sleep timeout) 
(mapv #(if (future-done? %) (deref %) timeout-val) vec-of-cf)) 

このコードはまた、(これは必須です場合)あなたがブロックすることができ、単一のcompletable未来を取得するためにCompletableFuture.allOfを使用する場合があります

関連する問題