package kr.debop4j.core.parallelism; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.RecursiveTask; /** * pudding.pudding.commons.parallelism.forkjoin.FibonacciTask * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 12. 9. 28. */ @Slf4j public class FibonacciTask extends RecursiveTask<Long> { private static final long serialVersionUID = -2895357520012193296L; private static final int THRESHOLD = 5; private FibonacciProblem problem; @Getter private long result; public FibonacciTask(FibonacciProblem problem) { this.problem = problem; } @Override protected Long compute() { if (problem.n < THRESHOLD) { result = problem.solve(); } else { FibonacciTask worker1 = new FibonacciTask(new FibonacciProblem(problem.n - 1)); FibonacciTask worker2 = new FibonacciTask(new FibonacciProblem(problem.n - 2)); worker1.fork(); result = worker2.compute() + worker1.join(); } return result; } }