Ваша задача, указанная в supplyAsync
, будет выполнена в ForkJoinPool#commonPool
.И если вы посмотрите на поток в common pool
, то увидите, что они Deamon thread
, это означает, что JVM не будет ожидать завершения работы этого потока демона, чтобы завершить его выполнение, когда нетactive non-daemon thread
. В вашем случае вы спите в composeMethod
, и тем временем основной поток выполняет и завершает свою работу, а JVM does not have any active non-daemon thread
. Итак, JVM перейдет на shut down
, не дожидаясь завершения вашей задачи,Если вы запустите приведенный ниже пример, вы можете подтвердить пул потоков и тип потока.
CompletableFuture feature = CompletableFuture.supplyAsync(() -> {
System.out.println("Thread : " + Thread.currentThread());
System.out.println("Is Daemon : " + Thread.currentThread().isDaemon());
return composeMethod();
}).thenAccept(s -> System.out.println("wassup java" + s)).thenRun(() -> System.out.println(" imm immortal"));
Вывод:
Thread : Thread[ForkJoinPool.commonPool-worker-1,5,main] // This line may be bit different but it indicates that your task is executing on Common pool
Is Daemon : true
why should i wait for you
Для решения проблемы вы можете передать своего собственного исполнителя, как показано ниже:
ExecutorService executorService = Executors.newFixedThreadPool(8);
CompletableFuture feature = CompletableFuture.supplyAsync(() -> {
System.out.println("Thread : " + Thread.currentThread());
System.out.println("Is Daemon : " + Thread.currentThread().isDaemon());
return composeMethod();
}, executorService).thenAccept(s -> System.out.println("wassup java" + s))
.thenRun(() -> System.out.println(" imm immortal"));
executorService.shutdown();
nonblockingmethod();
Вывод:
Thread : Thread[pool-1-thread-1,5,main]
Is Daemon : false
why should i wait for you
wassup java resultdaa
imm immortal