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