1 /* 2 * Written by Doug Lea with assistance from members of JCP JSR-166 3 * Expert Group and released to the public domain, as explained at 4 * http://creativecommons.org/publicdomain/zero/1.0/ 5 */ 6 7 package java.util.concurrent; 8 9 /** 10 * A recursive result-bearing {@link ForkJoinTask}. 11 * 12 * <p>For a classic example, here is a task computing Fibonacci numbers: 13 * 14 * <pre> {@code 15 * class Fibonacci extends RecursiveTask<Integer> { 16 * final int n; 17 * Fibonacci(int n) { this.n = n; } 18 * protected Integer compute() { 19 * if (n <= 1) 20 * return n; 21 * Fibonacci f1 = new Fibonacci(n - 1); 22 * f1.fork(); 23 * Fibonacci f2 = new Fibonacci(n - 2); 24 * return f2.compute() + f1.join(); 25 * } 26 * }}</pre> 27 * 28 * However, besides being a dumb way to compute Fibonacci functions 29 * (there is a simple fast linear algorithm that you'd use in 30 * practice), this is likely to perform poorly because the smallest 31 * subtasks are too small to be worthwhile splitting up. Instead, as 32 * is the case for nearly all fork/join applications, you'd pick some 33 * minimum granularity size (for example 10 here) for which you always 34 * sequentially solve rather than subdividing. 35 * 36 * @since 1.7 37 * @author Doug Lea 38 */ 39 public abstract class RecursiveTask<V> extends ForkJoinTask<V> { 40 private static final long serialVersionUID = 5232453952276485270L; 41 42 /** 43 * The result of the computation. 44 */ 45 V result; 46 47 /** 48 * The main computation performed by this task. 49 * @return the result of the computation 50 */ compute()51 protected abstract V compute(); 52 getRawResult()53 public final V getRawResult() { 54 return result; 55 } 56 setRawResult(V value)57 protected final void setRawResult(V value) { 58 result = value; 59 } 60 61 /** 62 * Implements execution conventions for RecursiveTask. 63 */ exec()64 protected final boolean exec() { 65 result = compute(); 66 return true; 67 } 68 69 } 70