ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166y/ForkJoinTask.java
(Generate patch)

Comparing jsr166/src/jsr166y/ForkJoinTask.java (file contents):
Revision 1.61 by jsr166, Thu Sep 16 03:57:13 2010 UTC vs.
Revision 1.62 by dl, Fri Sep 17 14:24:56 2010 UTC

# Line 28 | Line 28 | import java.util.WeakHashMap;
28   * start other subtasks.  As indicated by the name of this class,
29   * many programs using {@code ForkJoinTask} employ only methods
30   * {@link #fork} and {@link #join}, or derivatives such as {@link
31 < * #invokeAll}.  However, this class also provides a number of other
32 < * methods that can come into play in advanced usages, as well as
33 < * extension mechanics that allow support of new forms of fork/join
34 < * processing.
31 > * #invokeAll(ForkJoinTask...) invokeAll}.  However, this class also
32 > * provides a number of other methods that can come into play in
33 > * advanced usages, as well as extension mechanics that allow
34 > * support of new forms of fork/join processing.
35   *
36   * <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}.
37   * The efficiency of {@code ForkJoinTask}s stems from a set of
# Line 642 | Line 642 | public abstract class ForkJoinTask<V> im
642          setCompletion(NORMAL);
643      }
644  
645 +    /**
646 +     * @throws CancellationException {@inheritDoc}
647 +     */
648      public final V get() throws InterruptedException, ExecutionException {
649 <        quietlyJoin();
650 <        if (Thread.interrupted())
651 <            throw new InterruptedException();
652 <        int s = status;
649 >        int s;
650 >        if (Thread.currentThread() instanceof ForkJoinWorkerThread) {
651 >            quietlyJoin();
652 >            s = status;
653 >        }
654 >        else {
655 >            while ((s = status) >= 0) {
656 >                synchronized (this) { // interruptible form of awaitDone
657 >                    if (UNSAFE.compareAndSwapInt(this, statusOffset,
658 >                                                 s, SIGNAL)) {
659 >                        while (status >= 0)
660 >                            wait();
661 >                    }
662 >                }
663 >            }
664 >        }
665          if (s < NORMAL) {
666              Throwable ex;
667              if (s == CANCELLED)
# Line 657 | Line 672 | public abstract class ForkJoinTask<V> im
672          return getRawResult();
673      }
674  
675 +    /**
676 +     * @throws CancellationException {@inheritDoc}
677 +     */
678      public final V get(long timeout, TimeUnit unit)
679          throws InterruptedException, ExecutionException, TimeoutException {
680          Thread t = Thread.currentThread();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines