RecursiveAction — 결과 없는 재귀 ForkJoinTask
RecursiveAction — 결과 없는 재귀 ForkJoinTask
RecursiveAction은 결과 없는 재귀 ForkJoinTask 예요. 결과 없는 액션을 Void ForkJoinTask로 매개화하는 관례를 확립해요. null이 Void 타입의 유일한 유효 값이므로 join 같은 메서드는 완료 시 항상 null 을 반환해요. 분할 정복(divide-and-conquer) 작업을 ForkJoinPool에서 병렬 처리할 때 표준으로 써요.
본문
개념 이해하기
RecursiveAction은 결과 없는 재귀 ForkJoinTask예요. null 외의 결과가 없으므로 join은 완료 시 항상 null을 반환해요.
public abstract class RecursiveAction
extends ForkJoinTask<Void>
implements Serializable
활용 예 — ForkJoin 정렬
주어진 long[] 배열을 정렬하는 간단하지만 완전한 ForkJoin sort:
static class SortTask extends RecursiveAction {
final long[] array; final int lo, hi;
SortTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
SortTask(long[] array) { this(array, 0, array.length); }
protected void compute() {
if (hi - lo < THRESHOLD)
sortSequentially(lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(lo, mid, hi);
}
}
static final int THRESHOLD = 1000;
void sortSequentially(int lo, int hi) { Arrays.sort(array, lo, hi); }
void merge(int lo, int mid, int hi) {
long[] buf = Arrays.copyOfRange(array, lo, mid);
for (int i = 0, j = lo, k = mid; i < buf.length; j++)
array[j] = (k == hi || buf[i] < array[k]) ? buf[i++] : array[k++];
}
}
new SortTask(anArray)를 만들어 ForkJoinPool에서 invoke하면 배열을 정렬할 수 있어요.
활용 예 — 배열 요소 증가
class IncrementTask extends RecursiveAction {
final long[] array; final int lo, hi;
IncrementTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
protected void compute() {
if (hi - lo < THRESHOLD) {
for (int i = lo; i < hi; ++i) array[i]++;
}
else {
int mid = (lo + hi) >>> 1;
invokeAll(new IncrementTask(array, lo, mid),
new IncrementTask(array, mid, hi));
}
}
}
메서드
public RecursiveAction() — 서브클래스가 호출할 생성자.
protected abstract void compute() — 이 태스크가 수행하는 주요 계산.
public final Void getRawResult() — 항상 null 을 반환해요.
protected final void setRawResult(Void mustBeNull) — null 완료 값을 요구해요.
protected final boolean exec() — RecursiveAction의 실행 관례를 구현해요. 정상 완료된 것으로 알려지면 true.