--- jsr166/src/jsr166y/ForkJoinTask.java 2009/08/04 11:44:33 1.34
+++ jsr166/src/jsr166y/ForkJoinTask.java 2009/10/22 08:19:44 1.45
@@ -56,9 +56,9 @@ import java.util.WeakHashMap;
* exceptions such as {@code IOExceptions} to be thrown. However,
* computations may still encounter unchecked exceptions, that are
* rethrown to callers attempting to join them. These exceptions may
- * additionally include RejectedExecutionExceptions stemming from
- * internal resource exhaustion such as failure to allocate internal
- * task queues.
+ * additionally include {@link RejectedExecutionException} stemming
+ * from internal resource exhaustion, such as failure to allocate
+ * internal task queues.
*
*
The primary method for awaiting completion and extracting
* results of a task is {@link #join}, but there are several variants:
@@ -68,15 +68,27 @@ import java.util.WeakHashMap;
* execute other tasks while awaiting joins, which is sometimes more
* efficient but only applies when all subtasks are known to be
* strictly tree-structured. Method {@link #invoke} is semantically
- * equivalent to {@code fork(); join()} but always attempts to
- * begin execution in the current thread. The "quiet" forms
- * of these methods do not extract results or report exceptions. These
+ * equivalent to {@code fork(); join()} but always attempts to begin
+ * execution in the current thread. The "quiet" forms of
+ * these methods do not extract results or report exceptions. These
* may be useful when a set of tasks are being executed, and you need
* to delay processing of results or exceptions until all complete.
* Method {@code invokeAll} (available in multiple versions)
* performs the most common form of parallel invocation: forking a set
* of tasks and joining them all.
*
+ *
The execution status of tasks may be queried at several levels
+ * of detail: {@link #isDone} is true if a task completed in any way
+ * (including the case where a task was cancelled without executing);
+ * {@link #isCompletedNormally} is true if a task completed without
+ * cancellation or encountering an exception; {@link #isCancelled} is
+ * true if the task was cancelled (in which case {@link #getException}
+ * returns a {@link java.util.concurrent.CancellationException}); and
+ * {@link #isCompletedAbnormally} is true if a task was either
+ * cancelled or encountered an exception, in which case {@link
+ * #getException} will return either the encountered exception or
+ * {@link java.util.concurrent.CancellationException}.
+ *
*
The ForkJoinTask class is not usually directly subclassed.
* Instead, you subclass one of the abstract classes that support a
* particular style of fork/join processing, typically {@link
@@ -111,11 +123,11 @@ import java.util.WeakHashMap;
* improve throughput. If too small, then memory and internal task
* maintenance overhead may overwhelm processing.
*
- *
This class provides {@code adapt} methods for {@link
- * java.lang.Runnable} and {@link java.util.concurrent.Callable}, that
- * may be of use when mixing execution of ForkJoinTasks with other
- * kinds of tasks. When all tasks are of this form, consider using a
- * pool in {@link ForkJoinPool#setAsyncMode async mode}.
+ *
This class provides {@code adapt} methods for {@link Runnable}
+ * and {@link Callable}, that may be of use when mixing execution of
+ * {@code ForkJoinTasks} with other kinds of tasks. When all tasks
+ * are of this form, consider using a pool in
+ * {@linkplain ForkJoinPool#setAsyncMode async mode}.
*
*
ForkJoinTasks are {@code Serializable}, which enables them to be
* used in extensions such as remote execution frameworks. It is
@@ -378,10 +390,11 @@ public abstract class ForkJoinTask im
/**
* Returns result or throws exception using j.u.c.Future conventions.
- * Only call when {@code isDone} known to be true.
+ * Only call when {@code isDone} known to be true or thread known
+ * to be interrupted.
*/
private V reportFutureResult()
- throws ExecutionException, InterruptedException {
+ throws InterruptedException, ExecutionException {
if (Thread.interrupted())
throw new InterruptedException();
int s = status & COMPLETION_MASK;
@@ -407,11 +420,12 @@ public abstract class ForkJoinTask im
int s = status & COMPLETION_MASK;
if (s == NORMAL)
return getRawResult();
- if (s == CANCELLED)
+ else if (s == CANCELLED)
throw new CancellationException();
- if (s == EXCEPTIONAL && (ex = exceptionMap.get(this)) != null)
+ else if (s == EXCEPTIONAL && (ex = exceptionMap.get(this)) != null)
throw new ExecutionException(ex);
- throw new TimeoutException();
+ else
+ throw new TimeoutException();
}
// internal execution methods
@@ -497,6 +511,11 @@ public abstract class ForkJoinTask im
* Arranges to asynchronously execute this task. While it is not
* necessarily enforced, it is a usage error to fork a task more
* than once unless it has completed and been reinitialized.
+ * Subsequent modifications to the state of this task or any data
+ * it operates on are not necessarily consistently observable by
+ * any thread other than the one executing it unless preceded by a
+ * call to {@link #join} or related methods, or a call to {@link
+ * #isDone} returning {@code true}.
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -513,7 +532,7 @@ public abstract class ForkJoinTask im
}
/**
- * Returns the result of the computation when it is ready.
+ * Returns the result of the computation when it {@link #isDone is done}.
* This method differs from {@link #get()} in that
* abnormal completion results in {@code RuntimeException} or
* {@code Error}, not {@code ExecutionException}.
@@ -544,9 +563,10 @@ public abstract class ForkJoinTask im
/**
* Forks the given tasks, returning when {@code isDone} holds for
* each task or an (unchecked) exception is encountered, in which
- * case the exception is rethrown. If more than one task
- * encounters an exception, then this method throws any one of
- * these exceptions. The individual status of each task may be
+ * case the exception is rethrown. If either task encounters an
+ * exception, the other one may be, but is not guaranteed to be,
+ * cancelled. If both tasks throw an exception, then this method
+ * throws one of them. The individual status of each task may be
* checked using {@link #getException()} and related methods.
*
* This method may be invoked only from within {@code
@@ -709,21 +729,10 @@ public abstract class ForkJoinTask im
return (status & COMPLETION_MASK) == CANCELLED;
}
- /**
- * Returns {@code true} if the computation performed by this task
- * has completed (or has been cancelled).
- *
- * @return {@code true} if this computation has completed
- */
public final boolean isDone() {
return status < 0;
}
- /**
- * Returns {@code true} if this task was cancelled.
- *
- * @return {@code true} if this task was cancelled
- */
public final boolean isCancelled() {
return (status & COMPLETION_MASK) == CANCELLED;
}
@@ -749,15 +758,6 @@ public abstract class ForkJoinTask im
}
/**
- * Returns {@code true} if this task threw an exception.
- *
- * @return {@code true} if this task threw an exception
- */
- public final boolean isCompletedExceptionally() {
- return (status & COMPLETION_MASK) == EXCEPTIONAL;
- }
-
- /**
* Returns the exception thrown by the base computation, or a
* {@code CancellationException} if cancelled, or {@code null} if
* none or if the method has not yet completed.
@@ -766,11 +766,9 @@ public abstract class ForkJoinTask im
*/
public final Throwable getException() {
int s = status & COMPLETION_MASK;
- if (s >= NORMAL)
- return null;
- if (s == CANCELLED)
- return new CancellationException();
- return exceptionMap.get(this);
+ return ((s >= NORMAL) ? null :
+ (s == CANCELLED) ? new CancellationException() :
+ exceptionMap.get(this));
}
/**
@@ -783,9 +781,9 @@ public abstract class ForkJoinTask im
* overridable, but overridden versions must invoke {@code super}
* implementation to maintain guarantees.
*
- * @param ex the exception to throw. If this exception is
- * not a RuntimeException or Error, the actual exception thrown
- * will be a RuntimeException with cause ex.
+ * @param ex the exception to throw. If this exception is not a
+ * {@code RuntimeException} or {@code Error}, the actual exception
+ * thrown will be a {@code RuntimeException} with cause {@code ex}.
*/
public void completeExceptionally(Throwable ex) {
setDoneExceptionally((ex instanceof RuntimeException) ||
@@ -832,13 +830,13 @@ public abstract class ForkJoinTask im
}
/**
- * Possibly executes other tasks until this task is ready, then
- * returns the result of the computation. This method may be more
- * efficient than {@code join}, but is only applicable when
- * there are no potential dependencies between continuation of the
- * current task and that of any other task that might be executed
- * while helping. (This usually holds for pure divide-and-conquer
- * tasks).
+ * Possibly executes other tasks until this task {@link #isDone is
+ * done}, then returns the result of the computation. This method
+ * may be more efficient than {@code join}, but is only applicable
+ * when there are no potential dependencies between continuation
+ * of the current task and that of any other task that might be
+ * executed while helping. (This usually holds for pure
+ * divide-and-conquer tasks).
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -856,9 +854,10 @@ public abstract class ForkJoinTask im
}
/**
- * Possibly executes other tasks until this task is ready. This
- * method may be useful when processing collections of tasks when
- * some have been cancelled or otherwise known to have aborted.
+ * Possibly executes other tasks until this task {@link #isDone is
+ * done}. This method may be useful when processing collections
+ * of tasks when some have been cancelled or otherwise known to
+ * have aborted.
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -1220,7 +1219,7 @@ public abstract class ForkJoinTask im
private static final long serialVersionUID = -7721805057305804111L;
/**
- * Save the state to a stream.
+ * Saves the state to a stream.
*
* @serialData the current run status and the exception thrown
* during execution, or {@code null} if none
@@ -1233,7 +1232,7 @@ public abstract class ForkJoinTask im
}
/**
- * Reconstitute the instance from a stream.
+ * Reconstitutes the instance from a stream.
*
* @param s the stream
*/