RecursiveTask — 결과를 반환하는 재귀 ForkJoinTask

RecursiveTask — 결과를 반환하는 재귀 ForkJoinTask

RecursiveTask<V>결과를 반환하는 재귀 ForkJoinTask 예요. 각 분할 단계가 결과를 만들어내는 분할 정복 문제를 ForkJoinPool에서 병렬 처리할 때 표준으로 써요.

출처: Java API Reference

본문

개념 이해하기

RecursiveTask<V>는 결과를 반환하는 재귀 ForkJoinTask예요. 타입 매개변수 V는 태스크의 결과 타입이에요.

public abstract class RecursiveTask<V>
extends ForkJoinTask<V>
implements Serializable

활용 예 — 팩토리얼 계산

import java.util.concurrent.RecursiveTask;
import java.math.BigInteger;
public class Factorial {
    static class FactorialTask extends RecursiveTask<BigInteger> {
        private final int from, to;
        FactorialTask(int from, int to) { this.from = from; this.to = to; }
        protected BigInteger compute() {
            int range = to - from;
            if (range == 0) {                    // base case
                return BigInteger.valueOf(from);
            } else if (range == 1) {             // too small to parallelize
                return BigInteger.valueOf(from).multiply(BigInteger.valueOf(to));
            } else {                             // split in half
                int mid = from + range / 2;
                FactorialTask leftTask = new FactorialTask(from, mid);
                leftTask.fork();                 // perform about half the work locally
                return new FactorialTask(mid + 1, to).compute()
                        .multiply(leftTask.join());
            }
        }
    }
    static BigInteger factorial(int n) {         // uses ForkJoinPool.commonPool()
        return (n <= 1) ? BigInteger.ONE : new FactorialTask(1, n).invoke();
    }
    public static void main(String[] args) {
        System.out.println(factorial(Integer.parseInt(args[0])));
    }
}

메서드

public RecursiveTask() — 서브클래스가 호출할 생성자.

protected abstract V compute() — 이 태스크가 수행하는 주요 계산. 결과를 반환해요.

public final V getRawResult()ForkJoinTask.join()이 반환할 결과를 반환해요(비정상 완료여도). 디버깅·확장 지원용.

protected final void setRawResult(V value) — 주어진 값을 결과로 반환하도록 강제해요. 확장 지원용.

protected final boolean exec() — RecursiveTask의 실행 관례를 구현해요. 정상 완료되면 true.

더 알아보기 (Learn more)