Вот MCVE:Когда завершено? На самом деле завершено?
public static void main(String[] args) {
CompletableFuture<String> r1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "41";
});
CompletableFuture<String> r2 = CompletableFuture.supplyAsync(() -> "42");
CompletableFuture<String> r3 = CompletableFuture.supplyAsync(() -> {
System.out.println("I'm called.");
return "43";
});
CompletableFuture.allOf(r1, r2, r3).thenRun(() -> { System.out.println("End."); });
Stream.of(r1, r2, r3).forEach(System.out::println);
}
Несколько странно, фактически завершая CompletableFuture
от allOf(...)
, например, называя его join()
, я получаю следующий результат:
I'm called.
java[email protected]<...>[Not completed, 1 dependents]
[email protected]<...>[Completed normally]
[email protected]<...>[Completed normally]
Могу ли я знать, что вызывает виртуальная машина для лечения/думаю, что r1
имеет 1 (estimated number of) dependent CompletableFuture
, в то время как он решает прямолинейно полный r2
и r3
? Единственное различие, которое я вижу, это просто try-catch
, так и ответ такой же простой?
Для сравнения, я получаю ожидаемое время ожидания 5 секунд и следующий вывод, когда я на самом деле делаю join()
в конце. Если это помогает, я сталкиваюсь с этим на Java 8 Update 40 JVM.
Модификация:
// ...
CompletableFuture.allOf(r1, r2, r3).thenRun(() -> { System.out.println("End."); }).join();
Stream.of(r1, r2, r3).forEach(System.out::println);
Выход:
I'm called.
// <note: 5-second wait is here>
End.
[email protected]<...>[Completed normally]
[email protected]<...>[Completed normally]
[email protected]<...>[Completed normally]
«он решает прямо закончить r2 и r3» - никоим образом; это просто, что они завершены так быстро, до вызова 'forEach (:: println)'. – ZhongYu
@bayou println не заботится, если они завершены или вы имеете в виду что-то еще? –
Я имею в виду, что когда 'println (r2)' выполняется, 'r2' заканчивается исполнителем. это, конечно, не гарантировано. – ZhongYu