函数FutureTask.awaitdone()如何工作?

时间:2016-03-12 12:13:22

标签: futuretask

最近,我读了关于Java并发Jar的源代码,FutureTask类中的代码很难理解,awaitDone方法是这样的:

private int awaitDone(boolean timed, long nanos)
    throws InterruptedException {
    final long deadline = timed ? System.nanoTime() + nanos : 0L;
    WaitNode q = null;
    boolean queued = false;
    for (;;) {
        if (Thread.interrupted()) {
            removeWaiter(q);
            throw new InterruptedException();
        }

        int s = state;
        if (s > COMPLETING) {
            if (q != null)
                q.thread = null;
            return s;
        }
        else if (s == COMPLETING) // cannot time out yet
            Thread.yield();
        else if (q == null)
            q = new WaitNode();
        else if (!queued)
            queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
                                                 q.next = waiters, q);
        else if (timed) {
            nanos = deadline - System.nanoTime();
            if (nanos <= 0L) {
                removeWaiter(q);
                return state;
            }
            LockSupport.parkNanos(this, nanos);
        }
        else
            LockSupport.park(this);
    }
}

所以,问题是,我不明白服务员的用法,以及removeWaiter方法是如何工作的。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据FutureTask javadocs,服务员数据结构是一个Treiber Stack,一个无锁的数据结构。

当一个线程注意到未来被设置或取消时,它会通知任何其他等待的线程,他们可以继续(取消停放)。