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 ? () + nanos : 0L;
WaitNode q = null;
boolean queued = false;
for (;;) {
if (()) {
removeWaiter(q);
throw new InterruptedException();
}
int s = state;
if (s > COMPLETING) {
if (q != null)
= null;
return s;
}
else if (s == COMPLETING) // cannot time out yet
();
else if (q == null)
q = new WaitNode();
else if (!queued)
queued = (this, waitersOffset,
= waiters, q);
else if (timed) {
nanos = deadline - ();
if (nanos <= 0L) {
removeWaiter(q);
return state;
}
(this, nanos);
}
else
(this);
}
}