ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java Virtual Thread (4), ForkJoinPool
    카테고리 없음 2024. 6. 23. 13:29

    ForkJoinPool은 이미 Java에 구현되어 있는 클래스이다.  (Java1.7부터 지원) 

     

     

    예제를 하나 살펴보자. List에 들어있는 숫자 중 짝수를 필터링하고 값 하나를 가져오는 예제이다.

    @Slf4j
    public class ForkJoinPoolTest {
        public static void main(String[] args) {
            List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            Optional<Integer> op = list.stream()
                    .filter(item -> {
                        boolean isEven = item % 2 == 0;
                        return isEven;
                    })
                    .findAny();
    
            log.info("{}", op.get() );
        }
    }
    13:12:06.085 [main] INFO org.example.ForkJoinPoolTest -- 2

     

     

    값 하나를 가져오기 때문에 여러번 실행하여도 계속해서 2를 가져올 것이다. 싱글 스레드에서 동작하기 때문에 2를 가져오는 것이며 여러 스레드에서 동작하고 싶다면 stream 대신, parallelStream으로 변경하면 된다.

     

    그러면 병렬 스레드로 동작을 여러 스레드가 짝수를 검사하게된다. 

     

     

     

    그렇다면 스레드를 따로 만든적이 없는데 스레드는 어떻게 만들어지는 것일까?

    public class ForkJoinPoolTest {
        public static void main(String[] args) {
            List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            Optional<Integer> op = list.parallelStream()
                    .filter(item -> {
                        log.info("{}", Thread.currentThread());
                        boolean isEven = item % 2 == 0;
                        return isEven;
                    })
                    .findAny();
    
            log.info("{}", op.get() );
        }
    }
    > Task :ForkJoinPoolTest.main()
    13:21:47.360 [ForkJoinPool.commonPool-worker-7] INFO org.example.ForkJoinPoolTest -- Thread[#26,ForkJoinPool.commonPool-worker-7,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-4] INFO org.example.ForkJoinPoolTest -- Thread[#23,ForkJoinPool.commonPool-worker-4,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-5] INFO org.example.ForkJoinPoolTest -- Thread[#24,ForkJoinPool.commonPool-worker-5,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-1] INFO org.example.ForkJoinPoolTest -- Thread[#20,ForkJoinPool.commonPool-worker-1,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-8] INFO org.example.ForkJoinPoolTest -- Thread[#27,ForkJoinPool.commonPool-worker-8,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-6] INFO org.example.ForkJoinPoolTest -- Thread[#25,ForkJoinPool.commonPool-worker-6,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-3] INFO org.example.ForkJoinPoolTest -- Thread[#22,ForkJoinPool.commonPool-worker-3,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-9] INFO org.example.ForkJoinPoolTest -- Thread[#28,ForkJoinPool.commonPool-worker-9,5,main]
    13:21:47.360 [ForkJoinPool.commonPool-worker-2] INFO org.example.ForkJoinPoolTest -- Thread[#21,ForkJoinPool.commonPool-worker-2,5,main]
    13:21:47.360 [main] INFO org.example.ForkJoinPoolTest -- Thread[#1,main,5,main]
    13:21:47.362 [main] INFO org.example.ForkJoinPoolTest -- 4

     

     

    currentThread를 로그를 찍어 확인해보면 ForkJoinPool이 계속해서 생성되는 것을 확인할 수 있다. Java에서는 ThreadPool을 따로 지정하지 않았지만 ThreadPool이 필요하면  ForkJoinPool을 이용하여 스레드를 할당시켜준다. 

     

     

     

    그리고 Thread.currentThread().isDaemon()으로 Daemon 스레드인지 확인을 해보면 ForkJoinPool은 모두 true 이며, main 스레드는 false 인 것을 확인할 수 있다.

     

     

    정리하자면 ForkJoinPool은 자바가 자동으로 생성해주며, Daemon스레드로 동작한다

Designed by Tistory.