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() 로 직접 실행하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.