Я пытаюсь понять работу CompletableFuture
из Java 8. Ниже код работает, как ожидалось
CompletableFuture.supplyAsync(() -> {
System.out.println("supplyAsync Thread name " + Thread.currentThread().getName());
return "str";
}).thenApply(str -> {
System.out.println("thenApply Thread name " + Thread.currentThread().getName());
return str;
}).thenApply(str1 -> {
System.out.println("thenApply Thread name " + Thread.currentThread().getName());
return str1;
}).thenAccept(str3 -> {
System.out.println("thenAccept Thread name " + Thread.currentThread().getName());
});
System.out.println("Thread name " + Thread.currentThread().getName());
Вывод:
supplyAsync Thread name ForkJoinPool.commonPool-worker-1
thenApply Thread name main
thenApply Thread name main
thenAccept Thread name main
Thread name main
Но когда я вставил некоторые вычисления, это не работает должным образом, пожалуйста, исправьте меня, если я что-то упустил.
CompletableFuture.supplyAsync(() -> {
System.out.println("supplyAsync Thread name " + Thread.currentThread().getName());
long val = 0;
for (long i = 0; i < 1000000; i++) {
val++;
}
return "str";
}).thenApply(str -> {
System.out.println("thenApply Thread name " + Thread.currentThread().getName());
long val = 0;
for (long i = 0; i < 1000000; i++) {
val++;
}
return str;
}).thenApply(str1 -> {
System.out.println("thenApply Thread name " + Thread.currentThread().getName());
long val = 0;
for (long i = 0; i < 1000000; i++) {
val++;
}
return str1;
}).thenAccept(str3 -> {
System.out.println("thenAccept Thread name " + Thread.currentThread().getName());
long val = 0;
for (long i = 0; i < 1000000; i++) {
val++;
}
});
System.out.println("Thread name " + Thread.currentThread().getName());
Вывод:
supplyAsync Thread name ForkJoinPool.commonPool-worker-1
Thread name main
Я согласен, что я не присоединяю дочерний поток к основномунить.Насколько я понимаю, дочерний поток должен печатать операторы независимо от основного потока.Вопрос в том, почему он вообще не печатает.