자바에서 "fork/join" 프레임워크는 병렬 프로그래밍을 위한 도구로서, 주로 병렬화된 작업을 효율적으로 처리할 수 있게 해줍니다. 이 프레임워크는 Java 7부터 도입되었습니다. Fork/join 프레임워크의 핵심은 분할 정복(divide and conquer) 알고리즘을 사용하여 작업을 처리하고, 병렬성을 높일 수 있도록 설계되었습니다.
다음은 Fork/join 프레임워크의 주요 구성 요소와 사용 방법에 대한 간단한 설명입니다
1. ForkJoinPool 클래스
Fork/join 프레임워크에서는 작업 스레드를 관리하는데에 ForkJoinPool 클래스를 사용합니다. 이 클래스는 일종의 스레드 풀로, 작업을 여러 스레드로 분할하여 실행할 수 있도록 합니다.
2. RecursiveTask 및 RecursiveAction 클래스
Fork/join 프레임워크에서 처리되는 작업은 주로 RecursiveTask 또는 RecursiveAction 클래스를 확장하여 구현됩니다.
- RecursiveTask : 일반적으로 값을 반환하는 작업에 사용됩니다.
- RecursiveAction : 값을 반환하지 않는 작업에 사용됩니다.
3. ForkJoinTask 클래스
RecursiveTask와 RecursiveAction은 모두 ForkJoinTask를 상속받습니다. 이 클래스는 Fork/join 프레임워크에서 처리되는 작업의 기본 클래스로서, Fork/join 스케줄링 및 관련 동작을 지원합니다.
아래는 간단한 Fork/join 프레임워크를 사용하는 예제입니다. 이 예제에서는 배열의 합을 계산하는 작업을 병렬로 처리합니다.
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
class SumTask extends RecursiveTask<Long> {
private static final int THRESHOLD = 10;
private long[] array;
private int start;
private int end;
public SumTask(long[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if (end - start <= THRESHOLD) {
// 작업을 직접 처리
long sum = 0;
for (int i = start; i < end; i++) {
sum += array[i];
}
return sum;
} else {
// 작업을 두 개로 분할하여 처리
int mid = (start + end) / 2;
SumTask leftTask = new SumTask(array, start, mid);
SumTask rightTask = new SumTask(array, mid, end);
leftTask.fork(); // 왼쪽 부분 배열을 병렬로 처리
long rightResult = rightTask.compute(); // 오른쪽 부분 배열은 현재 스레드에서 처리
long leftResult = leftTask.join(); // 왼쪽 부분 배열의 결과를 기다림
return leftResult + rightResult;
}
}
}
public class Main {
public static void main(String[] args) {
// 테스트 배열
long[] array = new long[100];
for (int i = 0; i < array.length; i++) {
array[i] = i + 1;
}
// ForkJoinPool 생성
ForkJoinPool forkJoinPool = new ForkJoinPool();
// ForkJoinTask 생성 및 실행
SumTask task = new SumTask(array, 0, array.length);
long result = forkJoinPool.invoke(task);
System.out.println("Sum: " + result);
}
}
이 예제에서는 배열의 크기가 THRESHOLD 값보다 작을 때까지 작업을 나누어 계산하고, 그 이상이면 배열을 두 부분으로 나누어 각각을 병렬로 처리합니다. Fork/join 프레임워크는 이러한 작업을 효과적으로 분할하고 관리하여 병렬성을 높이는 데 도움을 줍니다.
With ChatGPT
'JAVA > 포스팅' 카테고리의 다른 글
자바 람다식 작성하기 (0) | 2023.11.22 |
---|---|
자바 람다식 (0) | 2023.11.22 |
자바 쓰레드 join 프레임웍 (0) | 2023.11.22 |
자바 쓰레드 volatile (0) | 2023.11.22 |
자바 쓰레드 Condition을 이용한 동기화 (0) | 2023.11.22 |