RecursiveAction — 결과 없는 재귀 ForkJoinTask

RecursiveAction — 결과 없는 재귀 ForkJoinTask

RecursiveAction결과 없는 재귀 ForkJoinTask 예요. 결과 없는 액션을 Void ForkJoinTask로 매개화하는 관례를 확립해요. nullVoid 타입의 유일한 유효 값이므로 join 같은 메서드는 완료 시 항상 null 을 반환해요. 분할 정복(divide-and-conquer) 작업을 ForkJoinPool에서 병렬 처리할 때 표준으로 써요.

출처: Java API Reference

본문

개념 이해하기

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.

더 알아보기 (Learn more)