>  Q&A  >  본문

JDK8에서 CompletableFuture를 사용할 때 발생하는 문제

으아악

결과는 다음과 같습니다.

으아악

위 코드의 마지막 줄을 주석 처리하면 기대한 결과를 얻을 수 없습니다.

왜 명시적으로 프로그램을 10초 동안 절전 모드로 전환해야 합니까?

伊谢尔伦伊谢尔伦2683일 전871

모든 응답(2)나는 대답할 것이다

  • 某草草

    某草草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 invoke commonPool().awaitQuiescence

    마지막

    을 넣으면 기대한 결과를 얻을 수도 있습니다sleep改成ForkJoinPool.commonPool().awaitQuiescence(2, TimeUnit.SECONDS);

    회신하다
    0
  • 某草草

    某草草2017-06-15 09:24:15

    검색: 데몬 스레드
    스레드에 데몬 스레드만 남으면 JVM이 종료됩니다. 그렇지 않으면 사용자 스레드가 있으면 JVM이 종료되지 않습니다.
    CompletableFuture.supplyAsync가 데몬 스레드를 시작한다고 추측할 수 있습니다. 실제로 CompletableFuture는 내부적으로 ForkJoinPool을 사용합니다.

    으아악

    그의 구현을 보고 매번 데몬 프로세스를 생성하세요. 메인 스레드가 휴면 상태여야 하는 이유는 이해하기 쉽습니다.

    회신하다
    0
  • 취소회신하다