--- jsr166/src/jsr166y/ForkJoinTask.java 2009/08/04 00:36:45 1.33
+++ jsr166/src/jsr166y/ForkJoinTask.java 2009/08/04 11:44:33 1.34
@@ -115,7 +115,7 @@ import java.util.WeakHashMap;
* 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}.
+ * pool in {@link ForkJoinPool#setAsyncMode async mode}.
*
*
ForkJoinTasks are {@code Serializable}, which enables them to be
* used in extensions such as remote execution frameworks. It is
@@ -382,6 +382,8 @@ public abstract class ForkJoinTask im
*/
private V reportFutureResult()
throws ExecutionException, InterruptedException {
+ if (Thread.interrupted())
+ throw new InterruptedException();
int s = status & COMPLETION_MASK;
if (s < NORMAL) {
Throwable ex;
@@ -389,8 +391,6 @@ public abstract class ForkJoinTask im
throw new CancellationException();
if (s == EXCEPTIONAL && (ex = exceptionMap.get(this)) != null)
throw new ExecutionException(ex);
- if (Thread.interrupted())
- throw new InterruptedException();
}
return getRawResult();
}
@@ -401,6 +401,8 @@ public abstract class ForkJoinTask im
*/
private V reportTimedFutureResult()
throws InterruptedException, ExecutionException, TimeoutException {
+ if (Thread.interrupted())
+ throw new InterruptedException();
Throwable ex;
int s = status & COMPLETION_MASK;
if (s == NORMAL)
@@ -409,8 +411,6 @@ public abstract class ForkJoinTask im
throw new CancellationException();
if (s == EXCEPTIONAL && (ex = exceptionMap.get(this)) != null)
throw new ExecutionException(ex);
- if (Thread.interrupted())
- throw new InterruptedException();
throw new TimeoutException();
}
@@ -529,10 +529,9 @@ public abstract class ForkJoinTask im
/**
* Commences performing this task, awaits its completion if
- * necessary, and return its result.
+ * necessary, and return its result, or throws an (unchecked)
+ * exception if the underlying computation did so.
*
- * @throws Throwable (a RuntimeException, Error, or unchecked
- * exception) if the underlying computation did so
* @return the computed result
*/
public final V invoke() {
@@ -543,8 +542,12 @@ public abstract class ForkJoinTask im
}
/**
- * Forks the given tasks, returning when {@code isDone} holds
- * for each task or an exception is encountered.
+ * 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
+ * checked using {@link #getException()} and related methods.
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -555,7 +558,6 @@ public abstract class ForkJoinTask im
* @param t1 the first task
* @param t2 the second task
* @throws NullPointerException if any task is null
- * @throws RuntimeException or Error if a task did so
*/
public static void invokeAll(ForkJoinTask> t1, ForkJoinTask> t2) {
t2.fork();
@@ -565,9 +567,13 @@ public abstract class ForkJoinTask im
/**
* Forks the given tasks, returning when {@code isDone} holds for
- * each task or an exception is encountered. If any task
- * encounters an exception, others may be, but are not guaranteed
- * to be, cancelled.
+ * each task or an (unchecked) exception is encountered, in which
+ * case the exception is rethrown. If any task encounters an
+ * exception, others may be, but are not guaranteed to be,
+ * cancelled. 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 checked using {@link #getException()}
+ * and related methods.
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -576,8 +582,7 @@ public abstract class ForkJoinTask im
* ClassCastException}.
*
* @param tasks the tasks
- * @throws NullPointerException if tasks or any element are null
- * @throws RuntimeException or Error if any task did so
+ * @throws NullPointerException if any task is null
*/
public static void invokeAll(ForkJoinTask>... tasks) {
Throwable ex = null;
@@ -614,11 +619,15 @@ public abstract class ForkJoinTask im
/**
* Forks all tasks in the specified collection, returning when
- * {@code isDone} holds for each task or an exception is
- * encountered. If any task encounters an exception, others may
- * be, but are not guaranteed to be, cancelled. The behavior of
- * this operation is undefined if the specified collection is
- * modified while the operation is in progress.
+ * {@code isDone} holds for each task or an (unchecked) exception
+ * is encountered. If any task encounters an exception, others
+ * may be, but are not guaranteed to be, cancelled. 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 checked using {@link #getException()} and related
+ * methods. The behavior of this operation is undefined if the
+ * specified collection is modified while the operation is in
+ * progress.
*
* This method may be invoked only from within {@code
* ForkJoinTask} computations (as may be determined using method
@@ -629,7 +638,6 @@ public abstract class ForkJoinTask im
* @param tasks the collection of tasks
* @return the tasks argument, to simplify usage
* @throws NullPointerException if tasks or any element are null
- * @throws RuntimeException or Error if any task did so
*/
public static > Collection invokeAll(Collection tasks) {
if (!(tasks instanceof RandomAccess) || !(tasks instanceof List>)) {
@@ -673,25 +681,6 @@ public abstract class ForkJoinTask im
}
/**
- * 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;
- }
-
- /**
* Attempts to cancel execution of this task. This attempt will
* fail if the task has already completed, has already been
* cancelled, or could not be cancelled for some other reason. If
@@ -721,6 +710,25 @@ public abstract class ForkJoinTask im
}
/**
+ * 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;
+ }
+
+ /**
* Returns {@code true} if this task threw an exception or was cancelled.
*
* @return {@code true} if this task threw an exception or was cancelled
@@ -730,6 +738,26 @@ public abstract class ForkJoinTask im
}
/**
+ * Returns {@code true} if this task completed without throwing an
+ * exception and was not cancelled.
+ *
+ * @return {@code true} if this task completed without throwing an
+ * exception and was not cancelled
+ */
+ public final boolean isCompletedNormally() {
+ return (status & COMPLETION_MASK) == NORMAL;
+ }
+
+ /**
+ * 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.
@@ -1022,11 +1050,10 @@ public abstract class ForkJoinTask im
* called otherwise. The return value controls whether this task
* is considered to be done normally. It may return false in
* asynchronous actions that require explicit invocations of
- * {@link #complete} to become joinable. It may throw exceptions
- * to indicate abnormal exit.
+ * {@link #complete} to become joinable. It may also throw an
+ * (unchecked) exception to indicate abnormal exit.
*
* @return {@code true} if completed normally
- * @throws Error or RuntimeException if encountered during computation
*/
protected abstract boolean exec();