ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166e/ForkJoinTask.java
Revision: 1.11
Committed: Sun Jan 20 03:44:14 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.10: +2 -1 lines
Log Message:
fix javadoc warning

File Contents

# User Rev Content
1 dl 1.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 jsr166e;
8    
9     import java.io.Serializable;
10     import java.util.Collection;
11     import java.util.List;
12     import java.util.RandomAccess;
13     import java.lang.ref.WeakReference;
14     import java.lang.ref.ReferenceQueue;
15     import java.util.concurrent.Callable;
16     import java.util.concurrent.CancellationException;
17     import java.util.concurrent.ExecutionException;
18     import java.util.concurrent.Future;
19     import java.util.concurrent.RejectedExecutionException;
20     import java.util.concurrent.RunnableFuture;
21     import java.util.concurrent.TimeUnit;
22     import java.util.concurrent.TimeoutException;
23     import java.util.concurrent.locks.ReentrantLock;
24     import java.lang.reflect.Constructor;
25    
26     /**
27     * Abstract base class for tasks that run within a {@link ForkJoinPool}.
28     * A {@code ForkJoinTask} is a thread-like entity that is much
29     * lighter weight than a normal thread. Huge numbers of tasks and
30     * subtasks may be hosted by a small number of actual threads in a
31     * ForkJoinPool, at the price of some usage limitations.
32     *
33 dl 1.2 * <p>A "main" {@code ForkJoinTask} begins execution when it is
34     * explicitly submitted to a {@link ForkJoinPool}, or, if not already
35     * engaged in a ForkJoin computation, commenced in the {@link
36 dl 1.5 * ForkJoinPool#commonPool()} via {@link #fork}, {@link #invoke}, or
37 dl 1.2 * related methods. Once started, it will usually in turn start other
38     * subtasks. As indicated by the name of this class, many programs
39     * using {@code ForkJoinTask} employ only methods {@link #fork} and
40     * {@link #join}, or derivatives such as {@link
41 dl 1.1 * #invokeAll(ForkJoinTask...) invokeAll}. However, this class also
42     * provides a number of other methods that can come into play in
43 dl 1.2 * advanced usages, as well as extension mechanics that allow support
44     * of new forms of fork/join processing.
45 dl 1.1 *
46     * <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}.
47     * The efficiency of {@code ForkJoinTask}s stems from a set of
48     * restrictions (that are only partially statically enforceable)
49     * reflecting their main use as computational tasks calculating pure
50     * functions or operating on purely isolated objects. The primary
51     * coordination mechanisms are {@link #fork}, that arranges
52     * asynchronous execution, and {@link #join}, that doesn't proceed
53     * until the task's result has been computed. Computations should
54     * ideally avoid {@code synchronized} methods or blocks, and should
55     * minimize other blocking synchronization apart from joining other
56     * tasks or using synchronizers such as Phasers that are advertised to
57     * cooperate with fork/join scheduling. Subdividable tasks should also
58 jsr166 1.6 * not perform blocking I/O, and should ideally access variables that
59 dl 1.1 * are completely independent of those accessed by other running
60     * tasks. These guidelines are loosely enforced by not permitting
61     * checked exceptions such as {@code IOExceptions} to be
62     * thrown. However, computations may still encounter unchecked
63     * exceptions, that are rethrown to callers attempting to join
64     * them. These exceptions may additionally include {@link
65     * RejectedExecutionException} stemming from internal resource
66     * exhaustion, such as failure to allocate internal task
67     * queues. Rethrown exceptions behave in the same way as regular
68     * exceptions, but, when possible, contain stack traces (as displayed
69     * for example using {@code ex.printStackTrace()}) of both the thread
70     * that initiated the computation as well as the thread actually
71     * encountering the exception; minimally only the latter.
72     *
73     * <p>It is possible to define and use ForkJoinTasks that may block,
74     * but doing do requires three further considerations: (1) Completion
75     * of few if any <em>other</em> tasks should be dependent on a task
76 jsr166 1.6 * that blocks on external synchronization or I/O. Event-style async
77 dl 1.1 * tasks that are never joined (for example, those subclassing {@link
78     * CountedCompleter}) often fall into this category. (2) To minimize
79     * resource impact, tasks should be small; ideally performing only the
80     * (possibly) blocking action. (3) Unless the {@link
81     * ForkJoinPool.ManagedBlocker} API is used, or the number of possibly
82     * blocked tasks is known to be less than the pool's {@link
83     * ForkJoinPool#getParallelism} level, the pool cannot guarantee that
84     * enough threads will be available to ensure progress or good
85     * performance.
86     *
87     * <p>The primary method for awaiting completion and extracting
88     * results of a task is {@link #join}, but there are several variants:
89     * The {@link Future#get} methods support interruptible and/or timed
90     * waits for completion and report results using {@code Future}
91     * conventions. Method {@link #invoke} is semantically
92     * equivalent to {@code fork(); join()} but always attempts to begin
93     * execution in the current thread. The "<em>quiet</em>" forms of
94     * these methods do not extract results or report exceptions. These
95     * may be useful when a set of tasks are being executed, and you need
96     * to delay processing of results or exceptions until all complete.
97     * Method {@code invokeAll} (available in multiple versions)
98     * performs the most common form of parallel invocation: forking a set
99     * of tasks and joining them all.
100     *
101     * <p>In the most typical usages, a fork-join pair act like a call
102     * (fork) and return (join) from a parallel recursive function. As is
103     * the case with other forms of recursive calls, returns (joins)
104     * should be performed innermost-first. For example, {@code a.fork();
105     * b.fork(); b.join(); a.join();} is likely to be substantially more
106     * efficient than joining {@code a} before {@code b}.
107     *
108     * <p>The execution status of tasks may be queried at several levels
109     * of detail: {@link #isDone} is true if a task completed in any way
110     * (including the case where a task was cancelled without executing);
111     * {@link #isCompletedNormally} is true if a task completed without
112     * cancellation or encountering an exception; {@link #isCancelled} is
113     * true if the task was cancelled (in which case {@link #getException}
114     * returns a {@link java.util.concurrent.CancellationException}); and
115     * {@link #isCompletedAbnormally} is true if a task was either
116     * cancelled or encountered an exception, in which case {@link
117     * #getException} will return either the encountered exception or
118     * {@link java.util.concurrent.CancellationException}.
119     *
120     * <p>The ForkJoinTask class is not usually directly subclassed.
121     * Instead, you subclass one of the abstract classes that support a
122     * particular style of fork/join processing, typically {@link
123     * RecursiveAction} for most computations that do not return results,
124     * {@link RecursiveTask} for those that do, and {@link
125     * CountedCompleter} for those in which completed actions trigger
126     * other actions. Normally, a concrete ForkJoinTask subclass declares
127     * fields comprising its parameters, established in a constructor, and
128     * then defines a {@code compute} method that somehow uses the control
129 dl 1.2 * methods supplied by this base class.
130 dl 1.1 *
131     * <p>Method {@link #join} and its variants are appropriate for use
132     * only when completion dependencies are acyclic; that is, the
133     * parallel computation can be described as a directed acyclic graph
134     * (DAG). Otherwise, executions may encounter a form of deadlock as
135     * tasks cyclically wait for each other. However, this framework
136     * supports other methods and techniques (for example the use of
137 jsr166 1.11 * {@link java.util.concurrent.Phaser}, {@link #helpQuiesce}, and
138     * {@link #complete}) that
139 dl 1.1 * may be of use in constructing custom subclasses for problems that
140     * are not statically structured as DAGs. To support such usages a
141     * ForkJoinTask may be atomically <em>tagged</em> with a {@code short}
142     * value using {@link #setForkJoinTaskTag} or {@link
143     * #compareAndSetForkJoinTaskTag} and checked using {@link
144     * #getForkJoinTaskTag}. The ForkJoinTask implementation does not use
145     * these {@code protected} methods or tags for any purpose, but they
146     * may be of use in the construction of specialized subclasses. For
147     * example, parallel graph traversals can use the supplied methods to
148     * avoid revisiting nodes/tasks that have already been processed.
149     * (Method names for tagging are bulky in part to encourage definition
150     * of methods that reflect their usage patterns.)
151     *
152     * <p>Most base support methods are {@code final}, to prevent
153     * overriding of implementations that are intrinsically tied to the
154     * underlying lightweight task scheduling framework. Developers
155     * creating new basic styles of fork/join processing should minimally
156     * implement {@code protected} methods {@link #exec}, {@link
157     * #setRawResult}, and {@link #getRawResult}, while also introducing
158     * an abstract computational method that can be implemented in its
159     * subclasses, possibly relying on other {@code protected} methods
160     * provided by this class.
161     *
162     * <p>ForkJoinTasks should perform relatively small amounts of
163     * computation. Large tasks should be split into smaller subtasks,
164     * usually via recursive decomposition. As a very rough rule of thumb,
165     * a task should perform more than 100 and less than 10000 basic
166     * computational steps, and should avoid indefinite looping. If tasks
167     * are too big, then parallelism cannot improve throughput. If too
168     * small, then memory and internal task maintenance overhead may
169     * overwhelm processing.
170     *
171     * <p>This class provides {@code adapt} methods for {@link Runnable}
172     * and {@link Callable}, that may be of use when mixing execution of
173     * {@code ForkJoinTasks} with other kinds of tasks. When all tasks are
174     * of this form, consider using a pool constructed in <em>asyncMode</em>.
175     *
176     * <p>ForkJoinTasks are {@code Serializable}, which enables them to be
177     * used in extensions such as remote execution frameworks. It is
178     * sensible to serialize tasks only before or after, but not during,
179     * execution. Serialization is not relied on during execution itself.
180     *
181     * @since 1.7
182     * @author Doug Lea
183     */
184     public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
185    
186     /*
187     * See the internal documentation of class ForkJoinPool for a
188     * general implementation overview. ForkJoinTasks are mainly
189     * responsible for maintaining their "status" field amidst relays
190     * to methods in ForkJoinWorkerThread and ForkJoinPool.
191     *
192     * The methods of this class are more-or-less layered into
193     * (1) basic status maintenance
194     * (2) execution and awaiting completion
195     * (3) user-level methods that additionally report results.
196     * This is sometimes hard to see because this file orders exported
197     * methods in a way that flows well in javadocs.
198     */
199    
200     /*
201     * The status field holds run control status bits packed into a
202     * single int to minimize footprint and to ensure atomicity (via
203     * CAS). Status is initially zero, and takes on nonnegative
204     * values until completed, upon which status (anded with
205     * DONE_MASK) holds value NORMAL, CANCELLED, or EXCEPTIONAL. Tasks
206     * undergoing blocking waits by other threads have the SIGNAL bit
207     * set. Completion of a stolen task with SIGNAL set awakens any
208     * waiters via notifyAll. Even though suboptimal for some
209     * purposes, we use basic builtin wait/notify to take advantage of
210     * "monitor inflation" in JVMs that we would otherwise need to
211     * emulate to avoid adding further per-task bookkeeping overhead.
212     * We want these monitors to be "fat", i.e., not use biasing or
213     * thin-lock techniques, so use some odd coding idioms that tend
214     * to avoid them, mainly by arranging that every synchronized
215     * block performs a wait, notifyAll or both.
216     *
217     * These control bits occupy only (some of) the upper half (16
218     * bits) of status field. The lower bits are used for user-defined
219     * tags.
220     */
221    
222     /** The run status of this task */
223     volatile int status; // accessed directly by pool and workers
224     static final int DONE_MASK = 0xf0000000; // mask out non-completion bits
225     static final int NORMAL = 0xf0000000; // must be negative
226     static final int CANCELLED = 0xc0000000; // must be < NORMAL
227     static final int EXCEPTIONAL = 0x80000000; // must be < CANCELLED
228     static final int SIGNAL = 0x00010000; // must be >= 1 << 16
229     static final int SMASK = 0x0000ffff; // short bits for tags
230    
231     /**
232     * Marks completion and wakes up threads waiting to join this
233     * task.
234     *
235     * @param completion one of NORMAL, CANCELLED, EXCEPTIONAL
236     * @return completion status on exit
237     */
238     private int setCompletion(int completion) {
239     for (int s;;) {
240     if ((s = status) < 0)
241     return s;
242     if (U.compareAndSwapInt(this, STATUS, s, s | completion)) {
243     if ((s >>> 16) != 0)
244     synchronized (this) { notifyAll(); }
245     return completion;
246     }
247     }
248     }
249    
250     /**
251     * Primary execution method for stolen tasks. Unless done, calls
252     * exec and records status if completed, but doesn't wait for
253     * completion otherwise.
254     *
255     * @return status on exit from this method
256     */
257     final int doExec() {
258     int s; boolean completed;
259     if ((s = status) >= 0) {
260     try {
261     completed = exec();
262     } catch (Throwable rex) {
263     return setExceptionalCompletion(rex);
264     }
265     if (completed)
266     s = setCompletion(NORMAL);
267     }
268     return s;
269     }
270    
271     /**
272     * Tries to set SIGNAL status unless already completed. Used by
273     * ForkJoinPool. Other variants are directly incorporated into
274     * externalAwaitDone etc.
275     *
276     * @return true if successful
277     */
278     final boolean trySetSignal() {
279     int s = status;
280     return s >= 0 && U.compareAndSwapInt(this, STATUS, s, s | SIGNAL);
281     }
282    
283     /**
284     * Blocks a non-worker-thread until completion.
285     * @return status upon completion
286     */
287     private int externalAwaitDone() {
288 dl 1.2 int s;
289 dl 1.4 ForkJoinPool.externalHelpJoin(this);
290 dl 1.1 boolean interrupted = false;
291 dl 1.4 while ((s = status) >= 0) {
292 dl 1.1 if (U.compareAndSwapInt(this, STATUS, s, s | SIGNAL)) {
293     synchronized (this) {
294     if (status >= 0) {
295     try {
296     wait();
297     } catch (InterruptedException ie) {
298     interrupted = true;
299     }
300     }
301     else
302     notifyAll();
303     }
304     }
305     }
306     if (interrupted)
307     Thread.currentThread().interrupt();
308     return s;
309     }
310    
311     /**
312     * Blocks a non-worker-thread until completion or interruption.
313     */
314     private int externalInterruptibleAwaitDone() throws InterruptedException {
315 dl 1.4 int s;
316 dl 1.1 if (Thread.interrupted())
317     throw new InterruptedException();
318 dl 1.4 ForkJoinPool.externalHelpJoin(this);
319     while ((s = status) >= 0) {
320 dl 1.1 if (U.compareAndSwapInt(this, STATUS, s, s | SIGNAL)) {
321     synchronized (this) {
322     if (status >= 0)
323     wait();
324     else
325     notifyAll();
326     }
327     }
328     }
329     return s;
330     }
331    
332 dl 1.4
333 dl 1.1 /**
334     * Implementation for join, get, quietlyJoin. Directly handles
335     * only cases of already-completed, external wait, and
336     * unfork+exec. Others are relayed to ForkJoinPool.awaitJoin.
337     *
338     * @return status upon completion
339     */
340     private int doJoin() {
341     int s; Thread t; ForkJoinWorkerThread wt; ForkJoinPool.WorkQueue w;
342 dl 1.2 return (s = status) < 0 ? s :
343     ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
344     (w = (wt = (ForkJoinWorkerThread)t).workQueue).
345     tryUnpush(this) && (s = doExec()) < 0 ? s :
346     wt.pool.awaitJoin(w, this) :
347     externalAwaitDone();
348 dl 1.1 }
349    
350     /**
351     * Implementation for invoke, quietlyInvoke.
352     *
353     * @return status upon completion
354     */
355     private int doInvoke() {
356     int s; Thread t; ForkJoinWorkerThread wt;
357 dl 1.2 return (s = doExec()) < 0 ? s :
358     ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
359     (wt = (ForkJoinWorkerThread)t).pool.awaitJoin(wt.workQueue, this) :
360     externalAwaitDone();
361 dl 1.1 }
362    
363     // Exception table support
364    
365     /**
366     * Table of exceptions thrown by tasks, to enable reporting by
367     * callers. Because exceptions are rare, we don't directly keep
368     * them with task objects, but instead use a weak ref table. Note
369     * that cancellation exceptions don't appear in the table, but are
370     * instead recorded as status values.
371     *
372     * Note: These statics are initialized below in static block.
373     */
374     private static final ExceptionNode[] exceptionTable;
375     private static final ReentrantLock exceptionTableLock;
376     private static final ReferenceQueue<Object> exceptionTableRefQueue;
377    
378     /**
379     * Fixed capacity for exceptionTable.
380     */
381     private static final int EXCEPTION_MAP_CAPACITY = 32;
382    
383     /**
384     * Key-value nodes for exception table. The chained hash table
385     * uses identity comparisons, full locking, and weak references
386     * for keys. The table has a fixed capacity because it only
387     * maintains task exceptions long enough for joiners to access
388     * them, so should never become very large for sustained
389     * periods. However, since we do not know when the last joiner
390     * completes, we must use weak references and expunge them. We do
391     * so on each operation (hence full locking). Also, some thread in
392     * any ForkJoinPool will call helpExpungeStaleExceptions when its
393     * pool becomes isQuiescent.
394     */
395     static final class ExceptionNode extends WeakReference<ForkJoinTask<?>> {
396     final Throwable ex;
397     ExceptionNode next;
398     final long thrower; // use id not ref to avoid weak cycles
399     ExceptionNode(ForkJoinTask<?> task, Throwable ex, ExceptionNode next) {
400     super(task, exceptionTableRefQueue);
401     this.ex = ex;
402     this.next = next;
403     this.thrower = Thread.currentThread().getId();
404     }
405     }
406    
407     /**
408     * Records exception and sets status.
409     *
410     * @return status on exit
411     */
412     final int recordExceptionalCompletion(Throwable ex) {
413     int s;
414     if ((s = status) >= 0) {
415     int h = System.identityHashCode(this);
416     final ReentrantLock lock = exceptionTableLock;
417     lock.lock();
418     try {
419     expungeStaleExceptions();
420     ExceptionNode[] t = exceptionTable;
421     int i = h & (t.length - 1);
422     for (ExceptionNode e = t[i]; ; e = e.next) {
423     if (e == null) {
424     t[i] = new ExceptionNode(this, ex, t[i]);
425     break;
426     }
427     if (e.get() == this) // already present
428     break;
429     }
430     } finally {
431     lock.unlock();
432     }
433     s = setCompletion(EXCEPTIONAL);
434     }
435     return s;
436     }
437    
438     /**
439 jsr166 1.8 * Records exception and possibly propagates.
440 dl 1.1 *
441     * @return status on exit
442     */
443     private int setExceptionalCompletion(Throwable ex) {
444     int s = recordExceptionalCompletion(ex);
445     if ((s & DONE_MASK) == EXCEPTIONAL)
446     internalPropagateException(ex);
447     return s;
448     }
449    
450     /**
451     * Hook for exception propagation support for tasks with completers.
452     */
453     void internalPropagateException(Throwable ex) {
454     }
455    
456     /**
457     * Cancels, ignoring any exceptions thrown by cancel. Used during
458     * worker and pool shutdown. Cancel is spec'ed not to throw any
459     * exceptions, but if it does anyway, we have no recourse during
460     * shutdown, so guard against this case.
461     */
462     static final void cancelIgnoringExceptions(ForkJoinTask<?> t) {
463     if (t != null && t.status >= 0) {
464     try {
465     t.cancel(false);
466     } catch (Throwable ignore) {
467     }
468     }
469     }
470    
471     /**
472     * Removes exception node and clears status
473     */
474     private void clearExceptionalCompletion() {
475     int h = System.identityHashCode(this);
476     final ReentrantLock lock = exceptionTableLock;
477     lock.lock();
478     try {
479     ExceptionNode[] t = exceptionTable;
480     int i = h & (t.length - 1);
481     ExceptionNode e = t[i];
482     ExceptionNode pred = null;
483     while (e != null) {
484     ExceptionNode next = e.next;
485     if (e.get() == this) {
486     if (pred == null)
487     t[i] = next;
488     else
489     pred.next = next;
490     break;
491     }
492     pred = e;
493     e = next;
494     }
495     expungeStaleExceptions();
496     status = 0;
497     } finally {
498     lock.unlock();
499     }
500     }
501    
502     /**
503     * Returns a rethrowable exception for the given task, if
504     * available. To provide accurate stack traces, if the exception
505     * was not thrown by the current thread, we try to create a new
506     * exception of the same type as the one thrown, but with the
507     * recorded exception as its cause. If there is no such
508     * constructor, we instead try to use a no-arg constructor,
509     * followed by initCause, to the same effect. If none of these
510     * apply, or any fail due to other exceptions, we return the
511     * recorded exception, which is still correct, although it may
512     * contain a misleading stack trace.
513     *
514     * @return the exception, or null if none
515     */
516     private Throwable getThrowableException() {
517     if ((status & DONE_MASK) != EXCEPTIONAL)
518     return null;
519     int h = System.identityHashCode(this);
520     ExceptionNode e;
521     final ReentrantLock lock = exceptionTableLock;
522     lock.lock();
523     try {
524     expungeStaleExceptions();
525     ExceptionNode[] t = exceptionTable;
526     e = t[h & (t.length - 1)];
527     while (e != null && e.get() != this)
528     e = e.next;
529     } finally {
530     lock.unlock();
531     }
532     Throwable ex;
533     if (e == null || (ex = e.ex) == null)
534     return null;
535     if (false && e.thrower != Thread.currentThread().getId()) {
536     Class<? extends Throwable> ec = ex.getClass();
537     try {
538     Constructor<?> noArgCtor = null;
539     Constructor<?>[] cs = ec.getConstructors();// public ctors only
540     for (int i = 0; i < cs.length; ++i) {
541     Constructor<?> c = cs[i];
542     Class<?>[] ps = c.getParameterTypes();
543     if (ps.length == 0)
544     noArgCtor = c;
545     else if (ps.length == 1 && ps[0] == Throwable.class)
546     return (Throwable)(c.newInstance(ex));
547     }
548     if (noArgCtor != null) {
549     Throwable wx = (Throwable)(noArgCtor.newInstance());
550     wx.initCause(ex);
551     return wx;
552     }
553     } catch (Exception ignore) {
554     }
555     }
556     return ex;
557     }
558    
559     /**
560     * Poll stale refs and remove them. Call only while holding lock.
561     */
562     private static void expungeStaleExceptions() {
563     for (Object x; (x = exceptionTableRefQueue.poll()) != null;) {
564     if (x instanceof ExceptionNode) {
565     ForkJoinTask<?> key = ((ExceptionNode)x).get();
566     ExceptionNode[] t = exceptionTable;
567     int i = System.identityHashCode(key) & (t.length - 1);
568     ExceptionNode e = t[i];
569     ExceptionNode pred = null;
570     while (e != null) {
571     ExceptionNode next = e.next;
572     if (e == x) {
573     if (pred == null)
574     t[i] = next;
575     else
576     pred.next = next;
577     break;
578     }
579     pred = e;
580     e = next;
581     }
582     }
583     }
584     }
585    
586     /**
587     * If lock is available, poll stale refs and remove them.
588     * Called from ForkJoinPool when pools become quiescent.
589     */
590     static final void helpExpungeStaleExceptions() {
591     final ReentrantLock lock = exceptionTableLock;
592     if (lock.tryLock()) {
593     try {
594     expungeStaleExceptions();
595     } finally {
596     lock.unlock();
597     }
598     }
599     }
600    
601     /**
602 dl 1.3 * A version of "sneaky throw" to relay exceptions
603     */
604     static void rethrow(final Throwable ex) {
605     if (ex != null) {
606     if (ex instanceof Error)
607     throw (Error)ex;
608     if (ex instanceof RuntimeException)
609     throw (RuntimeException)ex;
610 dl 1.9 ForkJoinTask.<RuntimeException>uncheckedThrow(ex);
611 dl 1.3 }
612     }
613    
614     /**
615     * The sneaky part of sneaky throw, relying on generics
616     * limitations to evade compiler complaints about rethrowing
617     * unchecked exceptions
618     */
619     @SuppressWarnings("unchecked") static <T extends Throwable>
620 dl 1.9 void uncheckedThrow(Throwable t) throws T {
621     if (t != null)
622     throw (T)t; // rely on vacuous cast
623 dl 1.3 }
624    
625     /**
626 dl 1.1 * Throws exception, if any, associated with the given status.
627     */
628     private void reportException(int s) {
629 dl 1.3 if (s == CANCELLED)
630     throw new CancellationException();
631     if (s == EXCEPTIONAL)
632     rethrow(getThrowableException());
633 dl 1.1 }
634    
635     // public methods
636    
637     /**
638 dl 1.2 * Arranges to asynchronously execute this task in the pool the
639     * current task is running in, if applicable, or using the {@link
640 dl 1.5 * ForkJoinPool#commonPool()} if not {@link #inForkJoinPool}. While
641 dl 1.2 * it is not necessarily enforced, it is a usage error to fork a
642     * task more than once unless it has completed and been
643     * reinitialized. Subsequent modifications to the state of this
644     * task or any data it operates on are not necessarily
645     * consistently observable by any thread other than the one
646     * executing it unless preceded by a call to {@link #join} or
647     * related methods, or a call to {@link #isDone} returning {@code
648     * true}.
649 dl 1.1 *
650     * @return {@code this}, to simplify usage
651     */
652     public final ForkJoinTask<V> fork() {
653 dl 1.2 Thread t;
654     if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
655     ((ForkJoinWorkerThread)t).workQueue.push(this);
656     else
657 dl 1.9 ForkJoinPool.common.externalPush(this);
658 dl 1.1 return this;
659     }
660    
661     /**
662     * Returns the result of the computation when it {@link #isDone is
663     * done}. This method differs from {@link #get()} in that
664     * abnormal completion results in {@code RuntimeException} or
665     * {@code Error}, not {@code ExecutionException}, and that
666     * interrupts of the calling thread do <em>not</em> cause the
667     * method to abruptly return by throwing {@code
668     * InterruptedException}.
669     *
670     * @return the computed result
671     */
672     public final V join() {
673     int s;
674     if ((s = doJoin() & DONE_MASK) != NORMAL)
675     reportException(s);
676     return getRawResult();
677     }
678    
679     /**
680     * Commences performing this task, awaits its completion if
681     * necessary, and returns its result, or throws an (unchecked)
682     * {@code RuntimeException} or {@code Error} if the underlying
683     * computation did so.
684     *
685     * @return the computed result
686     */
687     public final V invoke() {
688     int s;
689     if ((s = doInvoke() & DONE_MASK) != NORMAL)
690     reportException(s);
691     return getRawResult();
692     }
693    
694     /**
695     * Forks the given tasks, returning when {@code isDone} holds for
696     * each task or an (unchecked) exception is encountered, in which
697     * case the exception is rethrown. If more than one task
698     * encounters an exception, then this method throws any one of
699     * these exceptions. If any task encounters an exception, the
700     * other may be cancelled. However, the execution status of
701     * individual tasks is not guaranteed upon exceptional return. The
702     * status of each task may be obtained using {@link
703     * #getException()} and related methods to check if they have been
704     * cancelled, completed normally or exceptionally, or left
705     * unprocessed.
706     *
707     * @param t1 the first task
708     * @param t2 the second task
709     * @throws NullPointerException if any task is null
710     */
711     public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
712     int s1, s2;
713     t2.fork();
714     if ((s1 = t1.doInvoke() & DONE_MASK) != NORMAL)
715     t1.reportException(s1);
716     if ((s2 = t2.doJoin() & DONE_MASK) != NORMAL)
717     t2.reportException(s2);
718     }
719    
720     /**
721     * Forks the given tasks, returning when {@code isDone} holds for
722     * each task or an (unchecked) exception is encountered, in which
723     * case the exception is rethrown. If more than one task
724     * encounters an exception, then this method throws any one of
725     * these exceptions. If any task encounters an exception, others
726     * may be cancelled. However, the execution status of individual
727     * tasks is not guaranteed upon exceptional return. The status of
728     * each task may be obtained using {@link #getException()} and
729     * related methods to check if they have been cancelled, completed
730     * normally or exceptionally, or left unprocessed.
731     *
732     * @param tasks the tasks
733     * @throws NullPointerException if any task is null
734     */
735     public static void invokeAll(ForkJoinTask<?>... tasks) {
736     Throwable ex = null;
737     int last = tasks.length - 1;
738     for (int i = last; i >= 0; --i) {
739     ForkJoinTask<?> t = tasks[i];
740     if (t == null) {
741     if (ex == null)
742     ex = new NullPointerException();
743     }
744     else if (i != 0)
745     t.fork();
746     else if (t.doInvoke() < NORMAL && ex == null)
747     ex = t.getException();
748     }
749     for (int i = 1; i <= last; ++i) {
750     ForkJoinTask<?> t = tasks[i];
751     if (t != null) {
752     if (ex != null)
753     t.cancel(false);
754     else if (t.doJoin() < NORMAL)
755     ex = t.getException();
756     }
757     }
758     if (ex != null)
759 dl 1.3 rethrow(ex);
760 dl 1.1 }
761    
762     /**
763     * Forks all tasks in the specified collection, returning when
764     * {@code isDone} holds for each task or an (unchecked) exception
765     * is encountered, in which case the exception is rethrown. If
766     * more than one task encounters an exception, then this method
767     * throws any one of these exceptions. If any task encounters an
768     * exception, others may be cancelled. However, the execution
769     * status of individual tasks is not guaranteed upon exceptional
770     * return. The status of each task may be obtained using {@link
771     * #getException()} and related methods to check if they have been
772     * cancelled, completed normally or exceptionally, or left
773     * unprocessed.
774     *
775     * @param tasks the collection of tasks
776     * @return the tasks argument, to simplify usage
777     * @throws NullPointerException if tasks or any element are null
778     */
779     public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks) {
780     if (!(tasks instanceof RandomAccess) || !(tasks instanceof List<?>)) {
781     invokeAll(tasks.toArray(new ForkJoinTask<?>[tasks.size()]));
782     return tasks;
783     }
784     @SuppressWarnings("unchecked")
785     List<? extends ForkJoinTask<?>> ts =
786     (List<? extends ForkJoinTask<?>>) tasks;
787     Throwable ex = null;
788     int last = ts.size() - 1;
789     for (int i = last; i >= 0; --i) {
790     ForkJoinTask<?> t = ts.get(i);
791     if (t == null) {
792     if (ex == null)
793     ex = new NullPointerException();
794     }
795     else if (i != 0)
796     t.fork();
797     else if (t.doInvoke() < NORMAL && ex == null)
798     ex = t.getException();
799     }
800     for (int i = 1; i <= last; ++i) {
801     ForkJoinTask<?> t = ts.get(i);
802     if (t != null) {
803     if (ex != null)
804     t.cancel(false);
805     else if (t.doJoin() < NORMAL)
806     ex = t.getException();
807     }
808     }
809     if (ex != null)
810 dl 1.3 rethrow(ex);
811 dl 1.1 return tasks;
812     }
813    
814     /**
815     * Attempts to cancel execution of this task. This attempt will
816     * fail if the task has already completed or could not be
817     * cancelled for some other reason. If successful, and this task
818     * has not started when {@code cancel} is called, execution of
819     * this task is suppressed. After this method returns
820     * successfully, unless there is an intervening call to {@link
821     * #reinitialize}, subsequent calls to {@link #isCancelled},
822     * {@link #isDone}, and {@code cancel} will return {@code true}
823     * and calls to {@link #join} and related methods will result in
824     * {@code CancellationException}.
825     *
826     * <p>This method may be overridden in subclasses, but if so, must
827     * still ensure that these properties hold. In particular, the
828     * {@code cancel} method itself must not throw exceptions.
829     *
830     * <p>This method is designed to be invoked by <em>other</em>
831     * tasks. To terminate the current task, you can just return or
832     * throw an unchecked exception from its computation method, or
833     * invoke {@link #completeExceptionally}.
834     *
835     * @param mayInterruptIfRunning this value has no effect in the
836     * default implementation because interrupts are not used to
837     * control cancellation.
838     *
839     * @return {@code true} if this task is now cancelled
840     */
841     public boolean cancel(boolean mayInterruptIfRunning) {
842     return (setCompletion(CANCELLED) & DONE_MASK) == CANCELLED;
843     }
844    
845     public final boolean isDone() {
846     return status < 0;
847     }
848    
849     public final boolean isCancelled() {
850     return (status & DONE_MASK) == CANCELLED;
851     }
852    
853     /**
854     * Returns {@code true} if this task threw an exception or was cancelled.
855     *
856     * @return {@code true} if this task threw an exception or was cancelled
857     */
858     public final boolean isCompletedAbnormally() {
859     return status < NORMAL;
860     }
861    
862     /**
863     * Returns {@code true} if this task completed without throwing an
864     * exception and was not cancelled.
865     *
866     * @return {@code true} if this task completed without throwing an
867     * exception and was not cancelled
868     */
869     public final boolean isCompletedNormally() {
870     return (status & DONE_MASK) == NORMAL;
871     }
872    
873     /**
874     * Returns the exception thrown by the base computation, or a
875     * {@code CancellationException} if cancelled, or {@code null} if
876     * none or if the method has not yet completed.
877     *
878     * @return the exception, or {@code null} if none
879     */
880     public final Throwable getException() {
881     int s = status & DONE_MASK;
882     return ((s >= NORMAL) ? null :
883     (s == CANCELLED) ? new CancellationException() :
884     getThrowableException());
885     }
886    
887     /**
888     * Completes this task abnormally, and if not already aborted or
889     * cancelled, causes it to throw the given exception upon
890     * {@code join} and related operations. This method may be used
891     * to induce exceptions in asynchronous tasks, or to force
892     * completion of tasks that would not otherwise complete. Its use
893     * in other situations is discouraged. This method is
894     * overridable, but overridden versions must invoke {@code super}
895     * implementation to maintain guarantees.
896     *
897     * @param ex the exception to throw. If this exception is not a
898     * {@code RuntimeException} or {@code Error}, the actual exception
899     * thrown will be a {@code RuntimeException} with cause {@code ex}.
900     */
901     public void completeExceptionally(Throwable ex) {
902     setExceptionalCompletion((ex instanceof RuntimeException) ||
903     (ex instanceof Error) ? ex :
904     new RuntimeException(ex));
905     }
906    
907     /**
908     * Completes this task, and if not already aborted or cancelled,
909     * returning the given value as the result of subsequent
910     * invocations of {@code join} and related operations. This method
911     * may be used to provide results for asynchronous tasks, or to
912     * provide alternative handling for tasks that would not otherwise
913     * complete normally. Its use in other situations is
914     * discouraged. This method is overridable, but overridden
915     * versions must invoke {@code super} implementation to maintain
916     * guarantees.
917     *
918     * @param value the result value for this task
919     */
920     public void complete(V value) {
921     try {
922     setRawResult(value);
923     } catch (Throwable rex) {
924     setExceptionalCompletion(rex);
925     return;
926     }
927     setCompletion(NORMAL);
928     }
929    
930     /**
931     * Completes this task normally without setting a value. The most
932     * recent value established by {@link #setRawResult} (or {@code
933     * null} by default) will be returned as the result of subsequent
934     * invocations of {@code join} and related operations.
935     *
936     * @since 1.8
937     */
938     public final void quietlyComplete() {
939     setCompletion(NORMAL);
940     }
941    
942     /**
943     * Waits if necessary for the computation to complete, and then
944     * retrieves its result.
945     *
946     * @return the computed result
947     * @throws CancellationException if the computation was cancelled
948     * @throws ExecutionException if the computation threw an
949     * exception
950     * @throws InterruptedException if the current thread is not a
951     * member of a ForkJoinPool and was interrupted while waiting
952     */
953     public final V get() throws InterruptedException, ExecutionException {
954     int s = (Thread.currentThread() instanceof ForkJoinWorkerThread) ?
955     doJoin() : externalInterruptibleAwaitDone();
956     Throwable ex;
957     if ((s &= DONE_MASK) == CANCELLED)
958     throw new CancellationException();
959     if (s == EXCEPTIONAL && (ex = getThrowableException()) != null)
960     throw new ExecutionException(ex);
961     return getRawResult();
962     }
963    
964     /**
965     * Waits if necessary for at most the given time for the computation
966     * to complete, and then retrieves its result, if available.
967     *
968     * @param timeout the maximum time to wait
969     * @param unit the time unit of the timeout argument
970     * @return the computed result
971     * @throws CancellationException if the computation was cancelled
972     * @throws ExecutionException if the computation threw an
973     * exception
974     * @throws InterruptedException if the current thread is not a
975     * member of a ForkJoinPool and was interrupted while waiting
976     * @throws TimeoutException if the wait timed out
977     */
978     public final V get(long timeout, TimeUnit unit)
979     throws InterruptedException, ExecutionException, TimeoutException {
980     if (Thread.interrupted())
981     throw new InterruptedException();
982     // Messy in part because we measure in nanosecs, but wait in millisecs
983 dl 1.7 int s; long ms;
984     long ns = unit.toNanos(timeout);
985     if ((s = status) >= 0 && ns > 0L) {
986 dl 1.1 long deadline = System.nanoTime() + ns;
987     ForkJoinPool p = null;
988     ForkJoinPool.WorkQueue w = null;
989     Thread t = Thread.currentThread();
990     if (t instanceof ForkJoinWorkerThread) {
991     ForkJoinWorkerThread wt = (ForkJoinWorkerThread)t;
992     p = wt.pool;
993     w = wt.workQueue;
994 dl 1.4 p.helpJoinOnce(w, this); // no retries on failure
995 dl 1.1 }
996 dl 1.4 else
997     ForkJoinPool.externalHelpJoin(this);
998 dl 1.1 boolean canBlock = false;
999     boolean interrupted = false;
1000     try {
1001     while ((s = status) >= 0) {
1002 dl 1.4 if (w != null && w.qlock < 0)
1003 dl 1.1 cancelIgnoringExceptions(this);
1004     else if (!canBlock) {
1005 dl 1.4 if (p == null || p.tryCompensate())
1006 dl 1.1 canBlock = true;
1007     }
1008     else {
1009     if ((ms = TimeUnit.NANOSECONDS.toMillis(ns)) > 0L &&
1010     U.compareAndSwapInt(this, STATUS, s, s | SIGNAL)) {
1011     synchronized (this) {
1012     if (status >= 0) {
1013     try {
1014     wait(ms);
1015     } catch (InterruptedException ie) {
1016     if (p == null)
1017     interrupted = true;
1018     }
1019     }
1020     else
1021     notifyAll();
1022     }
1023     }
1024     if ((s = status) < 0 || interrupted ||
1025     (ns = deadline - System.nanoTime()) <= 0L)
1026     break;
1027     }
1028     }
1029     } finally {
1030     if (p != null && canBlock)
1031     p.incrementActiveCount();
1032     }
1033     if (interrupted)
1034     throw new InterruptedException();
1035     }
1036     if ((s &= DONE_MASK) != NORMAL) {
1037     Throwable ex;
1038     if (s == CANCELLED)
1039     throw new CancellationException();
1040     if (s != EXCEPTIONAL)
1041     throw new TimeoutException();
1042     if ((ex = getThrowableException()) != null)
1043     throw new ExecutionException(ex);
1044     }
1045     return getRawResult();
1046     }
1047    
1048     /**
1049     * Joins this task, without returning its result or throwing its
1050     * exception. This method may be useful when processing
1051     * collections of tasks when some have been cancelled or otherwise
1052     * known to have aborted.
1053     */
1054     public final void quietlyJoin() {
1055     doJoin();
1056     }
1057    
1058     /**
1059     * Commences performing this task and awaits its completion if
1060     * necessary, without returning its result or throwing its
1061     * exception.
1062     */
1063     public final void quietlyInvoke() {
1064     doInvoke();
1065     }
1066    
1067     /**
1068     * Possibly executes tasks until the pool hosting the current task
1069     * {@link ForkJoinPool#isQuiescent is quiescent}. This method may
1070     * be of use in designs in which many tasks are forked, but none
1071     * are explicitly joined, instead executing them until all are
1072     * processed.
1073     */
1074     public static void helpQuiesce() {
1075 dl 1.2 Thread t;
1076     if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) {
1077     ForkJoinWorkerThread wt = (ForkJoinWorkerThread)t;
1078     wt.pool.helpQuiescePool(wt.workQueue);
1079     }
1080     else
1081 dl 1.9 ForkJoinPool.quiesceCommonPool();
1082 dl 1.1 }
1083    
1084     /**
1085     * Resets the internal bookkeeping state of this task, allowing a
1086     * subsequent {@code fork}. This method allows repeated reuse of
1087     * this task, but only if reuse occurs when this task has either
1088     * never been forked, or has been forked, then completed and all
1089     * outstanding joins of this task have also completed. Effects
1090     * under any other usage conditions are not guaranteed.
1091     * This method may be useful when executing
1092     * pre-constructed trees of subtasks in loops.
1093     *
1094     * <p>Upon completion of this method, {@code isDone()} reports
1095     * {@code false}, and {@code getException()} reports {@code
1096     * null}. However, the value returned by {@code getRawResult} is
1097     * unaffected. To clear this value, you can invoke {@code
1098     * setRawResult(null)}.
1099     */
1100     public void reinitialize() {
1101     if ((status & DONE_MASK) == EXCEPTIONAL)
1102     clearExceptionalCompletion();
1103     else
1104     status = 0;
1105     }
1106    
1107     /**
1108     * Returns the pool hosting the current task execution, or null
1109     * if this task is executing outside of any ForkJoinPool.
1110     *
1111     * @see #inForkJoinPool
1112     * @return the pool, or {@code null} if none
1113     */
1114     public static ForkJoinPool getPool() {
1115     Thread t = Thread.currentThread();
1116     return (t instanceof ForkJoinWorkerThread) ?
1117     ((ForkJoinWorkerThread) t).pool : null;
1118     }
1119    
1120     /**
1121     * Returns {@code true} if the current thread is a {@link
1122     * ForkJoinWorkerThread} executing as a ForkJoinPool computation.
1123     *
1124     * @return {@code true} if the current thread is a {@link
1125     * ForkJoinWorkerThread} executing as a ForkJoinPool computation,
1126     * or {@code false} otherwise
1127     */
1128     public static boolean inForkJoinPool() {
1129     return Thread.currentThread() instanceof ForkJoinWorkerThread;
1130     }
1131    
1132     /**
1133     * Tries to unschedule this task for execution. This method will
1134 dl 1.2 * typically (but is not guaranteed to) succeed if this task is
1135     * the most recently forked task by the current thread, and has
1136     * not commenced executing in another thread. This method may be
1137     * useful when arranging alternative local processing of tasks
1138     * that could have been, but were not, stolen.
1139 dl 1.1 *
1140     * @return {@code true} if unforked
1141     */
1142     public boolean tryUnfork() {
1143 dl 1.2 Thread t;
1144 dl 1.4 return (((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
1145     ((ForkJoinWorkerThread)t).workQueue.tryUnpush(this) :
1146     ForkJoinPool.tryExternalUnpush(this));
1147 dl 1.1 }
1148    
1149     /**
1150     * Returns an estimate of the number of tasks that have been
1151     * forked by the current worker thread but not yet executed. This
1152     * value may be useful for heuristic decisions about whether to
1153     * fork other tasks.
1154     *
1155     * @return the number of tasks
1156     */
1157     public static int getQueuedTaskCount() {
1158 dl 1.4 Thread t; ForkJoinPool.WorkQueue q;
1159     if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
1160     q = ((ForkJoinWorkerThread)t).workQueue;
1161     else
1162     q = ForkJoinPool.commonSubmitterQueue();
1163     return (q == null) ? 0 : q.queueSize();
1164 dl 1.1 }
1165    
1166     /**
1167     * Returns an estimate of how many more locally queued tasks are
1168     * held by the current worker thread than there are other worker
1169 dl 1.2 * threads that might steal them, or zero if this thread is not
1170     * operating in a ForkJoinPool. This value may be useful for
1171 dl 1.1 * heuristic decisions about whether to fork other tasks. In many
1172     * usages of ForkJoinTasks, at steady state, each worker should
1173     * aim to maintain a small constant surplus (for example, 3) of
1174     * tasks, and to process computations locally if this threshold is
1175     * exceeded.
1176     *
1177     * @return the surplus number of tasks, which may be negative
1178     */
1179     public static int getSurplusQueuedTaskCount() {
1180 dl 1.4 return ForkJoinPool.getSurplusQueuedTaskCount();
1181 dl 1.1 }
1182    
1183     // Extension methods
1184    
1185     /**
1186     * Returns the result that would be returned by {@link #join}, even
1187     * if this task completed abnormally, or {@code null} if this task
1188     * is not known to have been completed. This method is designed
1189     * to aid debugging, as well as to support extensions. Its use in
1190     * any other context is discouraged.
1191     *
1192     * @return the result, or {@code null} if not completed
1193     */
1194     public abstract V getRawResult();
1195    
1196     /**
1197     * Forces the given value to be returned as a result. This method
1198     * is designed to support extensions, and should not in general be
1199     * called otherwise.
1200     *
1201     * @param value the value
1202     */
1203     protected abstract void setRawResult(V value);
1204    
1205     /**
1206     * Immediately performs the base action of this task and returns
1207     * true if, upon return from this method, this task is guaranteed
1208     * to have completed normally. This method may return false
1209     * otherwise, to indicate that this task is not necessarily
1210     * complete (or is not known to be complete), for example in
1211     * asynchronous actions that require explicit invocations of
1212     * completion methods. This method may also throw an (unchecked)
1213     * exception to indicate abnormal exit. This method is designed to
1214     * support extensions, and should not in general be called
1215     * otherwise.
1216     *
1217     * @return {@code true} if this task is known to have completed normally
1218     */
1219     protected abstract boolean exec();
1220    
1221     /**
1222     * Returns, but does not unschedule or execute, a task queued by
1223     * the current thread but not yet executed, if one is immediately
1224 dl 1.4 * available. There is no guarantee that this task will actually
1225     * be polled or executed next. Conversely, this method may return
1226     * null even if a task exists but cannot be accessed without
1227     * contention with other threads. This method is designed
1228 dl 1.1 * primarily to support extensions, and is unlikely to be useful
1229     * otherwise.
1230     *
1231     * @return the next task, or {@code null} if none are available
1232     */
1233     protected static ForkJoinTask<?> peekNextLocalTask() {
1234 dl 1.4 Thread t; ForkJoinPool.WorkQueue q;
1235     if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
1236     q = ((ForkJoinWorkerThread)t).workQueue;
1237     else
1238     q = ForkJoinPool.commonSubmitterQueue();
1239     return (q == null) ? null : q.peek();
1240 dl 1.1 }
1241    
1242     /**
1243     * Unschedules and returns, without executing, the next task
1244 dl 1.2 * queued by the current thread but not yet executed, if the
1245     * current thread is operating in a ForkJoinPool. This method is
1246     * designed primarily to support extensions, and is unlikely to be
1247     * useful otherwise.
1248 dl 1.1 *
1249     * @return the next task, or {@code null} if none are available
1250     */
1251     protected static ForkJoinTask<?> pollNextLocalTask() {
1252 dl 1.2 Thread t;
1253     return ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
1254     ((ForkJoinWorkerThread)t).workQueue.nextLocalTask() :
1255     null;
1256 dl 1.1 }
1257    
1258     /**
1259 dl 1.2 * If the current thread is operating in a ForkJoinPool,
1260     * unschedules and returns, without executing, the next task
1261 dl 1.1 * queued by the current thread but not yet executed, if one is
1262     * available, or if not available, a task that was forked by some
1263     * other thread, if available. Availability may be transient, so a
1264 dl 1.2 * {@code null} result does not necessarily imply quiescence of
1265     * the pool this task is operating in. This method is designed
1266 dl 1.1 * primarily to support extensions, and is unlikely to be useful
1267     * otherwise.
1268     *
1269     * @return a task, or {@code null} if none are available
1270     */
1271     protected static ForkJoinTask<?> pollTask() {
1272 dl 1.2 Thread t; ForkJoinWorkerThread wt;
1273     return ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
1274     (wt = (ForkJoinWorkerThread)t).pool.nextTaskFor(wt.workQueue) :
1275     null;
1276 dl 1.1 }
1277    
1278     // tag operations
1279    
1280     /**
1281     * Returns the tag for this task.
1282     *
1283     * @return the tag for this task
1284     * @since 1.8
1285     */
1286     public final short getForkJoinTaskTag() {
1287     return (short)status;
1288     }
1289    
1290     /**
1291     * Atomically sets the tag value for this task.
1292     *
1293     * @param tag the tag value
1294     * @return the previous value of the tag
1295     * @since 1.8
1296     */
1297     public final short setForkJoinTaskTag(short tag) {
1298     for (int s;;) {
1299     if (U.compareAndSwapInt(this, STATUS, s = status,
1300     (s & ~SMASK) | (tag & SMASK)))
1301     return (short)s;
1302     }
1303     }
1304    
1305     /**
1306     * Atomically conditionally sets the tag value for this task.
1307     * Among other applications, tags can be used as visit markers
1308     * in tasks operating on graphs, as in methods that check: {@code
1309     * if (task.compareAndSetForkJoinTaskTag((short)0, (short)1))}
1310     * before processing, otherwise exiting because the node has
1311     * already been visited.
1312     *
1313     * @param e the expected tag value
1314     * @param tag the new tag value
1315     * @return true if successful; i.e., the current value was
1316     * equal to e and is now tag.
1317     * @since 1.8
1318     */
1319     public final boolean compareAndSetForkJoinTaskTag(short e, short tag) {
1320     for (int s;;) {
1321     if ((short)(s = status) != e)
1322     return false;
1323     if (U.compareAndSwapInt(this, STATUS, s,
1324     (s & ~SMASK) | (tag & SMASK)))
1325     return true;
1326     }
1327     }
1328    
1329     /**
1330     * Adaptor for Runnables. This implements RunnableFuture
1331     * to be compliant with AbstractExecutorService constraints
1332     * when used in ForkJoinPool.
1333     */
1334     static final class AdaptedRunnable<T> extends ForkJoinTask<T>
1335     implements RunnableFuture<T> {
1336     final Runnable runnable;
1337     T result;
1338     AdaptedRunnable(Runnable runnable, T result) {
1339     if (runnable == null) throw new NullPointerException();
1340     this.runnable = runnable;
1341     this.result = result; // OK to set this even before completion
1342     }
1343     public final T getRawResult() { return result; }
1344     public final void setRawResult(T v) { result = v; }
1345     public final boolean exec() { runnable.run(); return true; }
1346     public final void run() { invoke(); }
1347     private static final long serialVersionUID = 5232453952276885070L;
1348     }
1349    
1350     /**
1351     * Adaptor for Runnables without results
1352     */
1353     static final class AdaptedRunnableAction extends ForkJoinTask<Void>
1354     implements RunnableFuture<Void> {
1355     final Runnable runnable;
1356     AdaptedRunnableAction(Runnable runnable) {
1357     if (runnable == null) throw new NullPointerException();
1358     this.runnable = runnable;
1359     }
1360     public final Void getRawResult() { return null; }
1361     public final void setRawResult(Void v) { }
1362     public final boolean exec() { runnable.run(); return true; }
1363     public final void run() { invoke(); }
1364     private static final long serialVersionUID = 5232453952276885070L;
1365     }
1366    
1367     /**
1368     * Adaptor for Callables
1369     */
1370     static final class AdaptedCallable<T> extends ForkJoinTask<T>
1371     implements RunnableFuture<T> {
1372     final Callable<? extends T> callable;
1373     T result;
1374     AdaptedCallable(Callable<? extends T> callable) {
1375     if (callable == null) throw new NullPointerException();
1376     this.callable = callable;
1377     }
1378     public final T getRawResult() { return result; }
1379     public final void setRawResult(T v) { result = v; }
1380     public final boolean exec() {
1381     try {
1382     result = callable.call();
1383     return true;
1384     } catch (Error err) {
1385     throw err;
1386     } catch (RuntimeException rex) {
1387     throw rex;
1388     } catch (Exception ex) {
1389     throw new RuntimeException(ex);
1390     }
1391     }
1392     public final void run() { invoke(); }
1393     private static final long serialVersionUID = 2838392045355241008L;
1394     }
1395    
1396     /**
1397     * Returns a new {@code ForkJoinTask} that performs the {@code run}
1398     * method of the given {@code Runnable} as its action, and returns
1399     * a null result upon {@link #join}.
1400     *
1401     * @param runnable the runnable action
1402     * @return the task
1403     */
1404     public static ForkJoinTask<?> adapt(Runnable runnable) {
1405     return new AdaptedRunnableAction(runnable);
1406     }
1407    
1408     /**
1409     * Returns a new {@code ForkJoinTask} that performs the {@code run}
1410     * method of the given {@code Runnable} as its action, and returns
1411     * the given result upon {@link #join}.
1412     *
1413     * @param runnable the runnable action
1414     * @param result the result upon completion
1415     * @return the task
1416     */
1417     public static <T> ForkJoinTask<T> adapt(Runnable runnable, T result) {
1418     return new AdaptedRunnable<T>(runnable, result);
1419     }
1420    
1421     /**
1422     * Returns a new {@code ForkJoinTask} that performs the {@code call}
1423     * method of the given {@code Callable} as its action, and returns
1424     * its result upon {@link #join}, translating any checked exceptions
1425     * encountered into {@code RuntimeException}.
1426     *
1427     * @param callable the callable action
1428     * @return the task
1429     */
1430     public static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable) {
1431     return new AdaptedCallable<T>(callable);
1432     }
1433    
1434     // Serialization support
1435    
1436     private static final long serialVersionUID = -7721805057305804111L;
1437    
1438     /**
1439     * Saves this task to a stream (that is, serializes it).
1440     *
1441     * @serialData the current run status and the exception thrown
1442     * during execution, or {@code null} if none
1443     */
1444     private void writeObject(java.io.ObjectOutputStream s)
1445     throws java.io.IOException {
1446     s.defaultWriteObject();
1447     s.writeObject(getException());
1448     }
1449    
1450     /**
1451     * Reconstitutes this task from a stream (that is, deserializes it).
1452     */
1453     private void readObject(java.io.ObjectInputStream s)
1454     throws java.io.IOException, ClassNotFoundException {
1455     s.defaultReadObject();
1456     Object ex = s.readObject();
1457     if (ex != null)
1458     setExceptionalCompletion((Throwable)ex);
1459     }
1460    
1461     // Unsafe mechanics
1462     private static final sun.misc.Unsafe U;
1463     private static final long STATUS;
1464 dl 1.4
1465 dl 1.1 static {
1466     exceptionTableLock = new ReentrantLock();
1467     exceptionTableRefQueue = new ReferenceQueue<Object>();
1468     exceptionTable = new ExceptionNode[EXCEPTION_MAP_CAPACITY];
1469     try {
1470     U = getUnsafe();
1471 dl 1.4 Class<?> k = ForkJoinTask.class;
1472 dl 1.1 STATUS = U.objectFieldOffset
1473 dl 1.4 (k.getDeclaredField("status"));
1474 dl 1.1 } catch (Exception e) {
1475     throw new Error(e);
1476     }
1477     }
1478    
1479     /**
1480     * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package.
1481     * Replace with a simple call to Unsafe.getUnsafe when integrating
1482     * into a jdk.
1483     *
1484     * @return a sun.misc.Unsafe
1485     */
1486     private static sun.misc.Unsafe getUnsafe() {
1487     try {
1488     return sun.misc.Unsafe.getUnsafe();
1489 jsr166 1.10 } catch (SecurityException tryReflectionInstead) {}
1490     try {
1491     return java.security.AccessController.doPrivileged
1492     (new java.security.PrivilegedExceptionAction<sun.misc.Unsafe>() {
1493     public sun.misc.Unsafe run() throws Exception {
1494     Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
1495     for (java.lang.reflect.Field f : k.getDeclaredFields()) {
1496     f.setAccessible(true);
1497     Object x = f.get(null);
1498     if (k.isInstance(x))
1499     return k.cast(x);
1500     }
1501     throw new NoSuchFieldError("the Unsafe");
1502     }});
1503     } catch (java.security.PrivilegedActionException e) {
1504     throw new RuntimeException("Could not initialize intrinsics",
1505     e.getCause());
1506 dl 1.1 }
1507     }
1508     }