PHpullh
학습 라이브러리/Java/Fork/Join 프레임워크

JAVA · 비동기/동시성

Fork/Join 프레임워크

분할-정복 알고리즘을 병렬로 실행하는 Fork/Join 프레임워크입니다.

비동기/동시성고급ForkJoinRecursiveTask분할정복병렬

핵심 설명

분할-정복 알고리즘을 병렬로 실행하는 Fork/Join 프레임워크입니다.

Java code

import java.util.concurrent.*;

public class ForkJoinDemo {
    // RecursiveTask — 결과 반환
    static class SumTask extends RecursiveTask<Long> {
        private final long[] array;
        private final int start, end;
        private static final int THRESHOLD = 1000;

        SumTask(long[] array, int start, int end) {
            this.array = array;
            this.start = start;
            this.end = end;
        }

        @Override
        protected Long compute() {
            int size = end - start;
            if (size <= THRESHOLD) {
                // 기본 케이스: 직접 계산
                long sum = 0;
                for (int i = start; i < end; i++) sum += array[i];
                return sum;
            }
            // 분할
            int mid = start + size / 2;
            SumTask left = new SumTask(array, start, mid);
            SumTask right = new SumTask(array, mid, end);

            left.fork();  // 비동기 실행
            long rightResult = right.compute(); // 현재 스레드
            long leftResult = left.join();      // 결과 대기

            return leftResult + rightResult;
        }
    }

    public static void main(String[] args) {
        long[] array = new long[10_000_000];
        for (int i = 0; i < array.length; i++) array[i] = i + 1;

        ForkJoinPool pool = new ForkJoinPool();
        long result = pool.invoke(new SumTask(array, 0, array.length));
        System.out.println("합계: " + result);
        System.out.println("병렬도: " + pool.getParallelism());
        pool.shutdown();
    }
}

학습 팁

오른쪽 태스크를 compute()로 현재 스레드에서 실행하고, 왼쪽만 fork()하면 불필요한 스레드 생성을 줄입니다.

주의할 점

두 태스크 모두 fork()하면 현재 스레드가 놀게 됩니다. 하나는 반드시 compute()로 직접 실행하세요.

자주 묻는 질문

Fork/Join 프레임워크란 무엇인가요?

분할-정복 알고리즘을 병렬로 실행하는 Fork/Join 프레임워크입니다.

Fork/Join 프레임워크 학습 시 주의할 점은 무엇인가요?

두 태스크 모두 fork() 하면 현재 스레드가 놀게 됩니다. 하나는 반드시 compute() 로 직접 실행하세요.