결과는 다음과 같습니다.
으아악위 코드의 마지막 줄을 주석 처리하면 기대한 결과를 얻을 수 없습니다.
왜 명시적으로 프로그램을 10초 동안 절전 모드로 전환해야 합니까?
某草草2017-06-15 09:24:15
CompletableFuture.supplyAsync
의 javadoc 보기:
주어진 공급자를 호출하여 얻은 값을 사용하여
ForkJoinPool.commonPool()
에서 실행 중인 작업에 의해 비동기적으로 완료되는 새로운 CompletableFuture를 반환합니다.
그리고 ForkJoinPool.commonPool()
의 javadoc:
마지막공통 풀 인스턴스를 반환합니다. 이 풀은 종료 또는 shutdownNow 시도에 영향을 받지 않습니다. 그러나 이 풀과 진행 중인 모든 처리는 프로그램 종료 전에 자동으로 종료됩니다.
System.exit
. Any program that relies on asynchronous task processing to complete before program termination should invokecommonPool().awaitQuiescence
을 넣으면 기대한 결과를 얻을 수도 있습니다sleep
改成ForkJoinPool.commonPool().awaitQuiescence(2, TimeUnit.SECONDS);
某草草2017-06-15 09:24:15
검색: 데몬 스레드
스레드에 데몬 스레드만 남으면 JVM이 종료됩니다. 그렇지 않으면 사용자 스레드가 있으면 JVM이 종료되지 않습니다.
CompletableFuture.supplyAsync가 데몬 스레드를 시작한다고 추측할 수 있습니다. 실제로 CompletableFuture는 내부적으로 ForkJoinPool을 사용합니다.
그의 구현을 보고 매번 데몬 프로세스를 생성하세요. 메인 스레드가 휴면 상태여야 하는 이유는 이해하기 쉽습니다.