FutureTask类中get方法阻塞的问题:
get方法的实现:
/*** @throws CancellationException {@inheritDoc}*/public V get() throws InterruptedException, ExecutionException {int s = state;if (s <= COMPLETING)s = awaitDone(false, 0L);return report(s);}
这里的state是线程完成的标志,线程完成之后该state为2。线程启动之前该值为1。
COMPLETING的值为1。
s <= COMPLETING表示当前线程还未执行完。就调用awaitDone方法。
awaitDone方法中:
第一个参数:timed true if use timed waits,为false表示不使用timed waits,意思是不设置超时时间,如果线程未完成,会一直阻塞。
第二个参数:nanos time ,等待的时间。
awaitDone方法的实现:
/*** Awaits completion or aborts on interrupt or timeout.** @param timed true if use timed waits* @param nanos time to wait, if timed* @return state upon completion*/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 yetThread.yield();else if (q == null)q = new WaitNode();else if (!queued)queued = pareAndSwapObject(this, waitersOffset,q.next = waiters, q);else if (timed) {nanos = deadline - System.nanoTime();if (nanos <= 0L) {removeWaiter(q);return state;}LockSupport.parkNanos(this, nanos);}elseLockSupport.park(this);}}