Почему CompletableFuture.runAsync не выполняется? - PullRequest
0 голосов
/ 09 мая 2019

Я считаю, что основной поток должен заканчиваться после подпотока. Но нижеприведенный код показывает, что процесс завершен до вывода "асинхронного конца". В чем причина? Кто-нибудь может объяснить? Thx.

import java.util.concurrent.CompletableFuture;

public class Test {
    public static void main(String[] args) {
        CompletableFuture.runAsync(() -> {
            try {
                System.out.println("async start");
                Thread.sleep(3000);
                System.out.println("async end");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println("main end");
    }
}

1 Ответ

4 голосов
/ 09 мая 2019

Выполнено, вы просто не ждете результата.

Javadoc CompleteableFuture.runAsync() говорит:

Возвращает новое CompletableFuture, которое асинхронно завершается задачей, выполняемой в ForkJoinPool.commonPool() после выполнения данного действия.

Javadoc ForkJoinPool.commonPool() говорит:

Любая программа, для которой выполнение асинхронной задачи завершается до ее завершения, должна вызывать commonPool().awaitQuiescence() перед завершением.

Итак, вызовите это.

...