当另一组CompletableFutures完成后,您如何完成CompletableFuture?

时间:2015-12-11 17:23:35

标签: java lambda java-8 completable-future

我有一个可完成的未来(future1),它创造了10个可完成的期货(futureN)。有没有办法在所有futureN完成后将future1设置为完成?

2 个答案:

答案 0 :(得分:6)

我不确定你的意思是“未来创造其他未来”,但是如果你有许多未来并且你想在完成后做某事你可以这样做: CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));

答案 1 :(得分:2)

CompletableFuture不是行为的东西所以我不确定你的意思

  

创造10个可完成的期货

我假设您的意思是您提交了runAsyncsubmitAsync的任务。我的例子不会,但如果你这样做,行为是一样的。

创建根CompletableFuture。然后异步运行一些代码来创建您的未来(通过ExecutorrunAsync,在新Thread内,或内联CompletableFuture返回值)。收集10个CompletableFuture个对象,然后使用CompletableFuture#allOf获取CompletableFuture,这些public static void main(String args[]) throws Exception { CompletableFuture<String> root = new CompletableFuture<>(); ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { CompletableFuture<String> cf1 = CompletableFuture.completedFuture("first"); CompletableFuture<String> cf2 = CompletableFuture.completedFuture("second"); System.out.println("running"); CompletableFuture.allOf(cf1, cf2).thenRun(() -> root.complete("some value")); }); // once the internal 10 have completed (successfully) root.thenAccept(r -> { System.out.println(r); // "some value" }); Thread.sleep(100); executor.shutdown(); } 将在完成后完成(异常或其他方式)。然后,您可以使用thenRun为其添加续约,以完成您的未来。

例如

<input type="file" name="Files" id="myFile1"/>
<input type="file" name="Files" id="myFile2"/>
<input type="file" name="Files" id="myFile3"/>

var myFile1Size = document.getElementById('myFile1').files[0].size;
// check file size
var myFile2Size = document.getElementById('myFile2').files[0].size;
// check file size
var myFile3Size = document.getElementById('myFile3').files[0].size;
// check file size