ForkJoinPool을 사용할 때 다음 응용 프로그램이 즉시 종료되지만 ThreadPoolExecutor를 사용할 때는 왜 종료되지 않습니까?

jzheaux

ForkJoinPool과 ThreadPoolExecutor의 차이점 중 일부를 이해하려고 노력 중이며 다음 내용이 내 관심을 끌었습니다.

ThreadPoolExecutor 사용

public static void main(String[] args) {
    ExecutorService es = Executors.newCachedThreadPool();
    es.execute(() -> System.out.println("Hello."));
    es.shutdown();
}

이 프로그램은 항상 "Hello"를 출력합니다. 화면에.

ForkJoinPool 사용

public static void main(String[] args) {
    ForkJoinPool es = new ForkJoinPool(1);
    es.execute(() -> System.out.println("Hello."));
    es.shutdown();
}

이 프로그램은 때때로 "Hello"를 출력합니다. 화면에.

여기서 무슨 일이 일어나고 있습니까?

정상 종료 호출을 받으면 첫 번째 프로그램은 절대 종료되지 않지만 그렇지 않으면 둘 다 동일하게 작동합니다.

fork / join 동작은 JVM이 단순히 실행 된 스레드가 종료 될 때까지 기다리지 않고 때때로 스레드가 메인이 완료되기 전에 실행될만큼 운이 좋다는 점에 주목함으로써 설명 할 수 있음을 이해합니다. 첫 번째 솔루션에서 이와 동일한 동작이 나타나지 않는 이유는 무엇입니까?

대답은 둘 다 실제로 똑같이 작동하고 첫 번째 솔루션을 실행할 때 운이 좋다는 것입니다. 실제로 첫 번째 솔루션을 100 번 실행하면 "Hello"가 표시됩니다. 모두 100 번이지만 두 번째를 100 번 실행하면 "Hello"가 표시됩니다. 대략 10 번. "항상"이라는 단어가 정확하게 정확하지 않더라도 두 가지 작동 방식 사이에 명백하게 다른 동작을 일으키는 주요 차이점이있는 것으로 보입니다.

존 빈트

ForkJoinPool데몬 스레드로 정의됩니다. 즉, FJP가 생성 한 각 Thread는 setDaemon(true). JVM을 실행하는 데몬 스레드 만 있으면 즉시 종료됩니다.

당신은 아마해야 shutdown다음 awaitTermination.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관