--- jsr166/src/jsr166y/ForkJoinTask.java 2010/09/06 11:55:39 1.58
+++ jsr166/src/jsr166y/ForkJoinTask.java 2010/09/17 14:24:56 1.62
@@ -28,10 +28,10 @@ import java.util.WeakHashMap;
* start other subtasks. As indicated by the name of this class,
* many programs using {@code ForkJoinTask} employ only methods
* {@link #fork} and {@link #join}, or derivatives such as {@link
- * #invokeAll}. However, this class also provides a number of other
- * methods that can come into play in advanced usages, as well as
- * extension mechanics that allow support of new forms of fork/join
- * processing.
+ * #invokeAll(ForkJoinTask...) invokeAll}. However, this class also
+ * provides a number of other methods that can come into play in
+ * advanced usages, as well as extension mechanics that allow
+ * support of new forms of fork/join processing.
*
*
A {@code ForkJoinTask} is a lightweight form of {@link Future}.
* The efficiency of {@code ForkJoinTask}s stems from a set of
@@ -153,7 +153,7 @@ public abstract class ForkJoinTask im
* single int to minimize footprint and to ensure atomicity (via
* CAS). Status is initially zero, and takes on nonnegative
* values until completed, upon which status holds value
- * NORMAL. CANCELLED, or EXCEPTIONAL. Tasks undergoing blocking
+ * NORMAL, CANCELLED, or EXCEPTIONAL. Tasks undergoing blocking
* waits by other threads have the SIGNAL bit set. Completion of
* a stolen task with SIGNAL set awakens any waiters via
* notifyAll. Even though suboptimal for some purposes, we use
@@ -206,7 +206,7 @@ public abstract class ForkJoinTask im
/**
* Records exception and sets exceptional completion.
- *
+ *
* @return status on exit
*/
private void setExceptionalCompletion(Throwable rex) {
@@ -223,7 +223,7 @@ public abstract class ForkJoinTask im
int s; // the odd construction reduces lock bias effects
while ((s = status) >= 0) {
try {
- synchronized(this) {
+ synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait();
}
@@ -243,7 +243,7 @@ public abstract class ForkJoinTask im
int s;
if ((s = status) >= 0) {
try {
- synchronized(this) {
+ synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait(millis, 0);
}
@@ -261,7 +261,7 @@ public abstract class ForkJoinTask im
private void externalAwaitDone() {
int s;
while ((s = status) >= 0) {
- synchronized(this) {
+ synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s, SIGNAL)){
boolean interrupted = false;
while (status >= 0) {
@@ -642,11 +642,26 @@ public abstract class ForkJoinTask im
setCompletion(NORMAL);
}
+ /**
+ * @throws CancellationException {@inheritDoc}
+ */
public final V get() throws InterruptedException, ExecutionException {
- quietlyJoin();
- if (Thread.interrupted())
- throw new InterruptedException();
- int s = status;
+ int s;
+ if (Thread.currentThread() instanceof ForkJoinWorkerThread) {
+ quietlyJoin();
+ s = status;
+ }
+ else {
+ while ((s = status) >= 0) {
+ synchronized (this) { // interruptible form of awaitDone
+ if (UNSAFE.compareAndSwapInt(this, statusOffset,
+ s, SIGNAL)) {
+ while (status >= 0)
+ wait();
+ }
+ }
+ }
+ }
if (s < NORMAL) {
Throwable ex;
if (s == CANCELLED)
@@ -657,6 +672,9 @@ public abstract class ForkJoinTask im
return getRawResult();
}
+ /**
+ * @throws CancellationException {@inheritDoc}
+ */
public final V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
Thread t = Thread.currentThread();
@@ -698,7 +716,7 @@ public abstract class ForkJoinTask im
long ms = nt / 1000000;
int ns = (int) (nt % 1000000);
try {
- synchronized(this) {
+ synchronized (this) {
if (status >= 0)
wait(ms, ns);
}