我有一个可完成的未来(future1),它创造了10个可完成的期货(futureN)。有没有办法在所有futureN完成后将future1设置为完成?
答案 0 :(得分:6)
我不确定你的意思是“未来创造其他未来”,但是如果你有许多未来并且你想在完成后做某事你可以这样做:
CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));
答案 1 :(得分:2)
CompletableFuture
不是行为的东西所以我不确定你的意思
创造10个可完成的期货
我假设您的意思是您提交了runAsync
或submitAsync
的任务。我的例子不会,但如果你这样做,行为是一样的。
创建根CompletableFuture
。然后异步运行一些代码来创建您的未来(通过Executor
,runAsync
,在新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