600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Java多线程-FutureTask的get方法阻塞问题

Java多线程-FutureTask的get方法阻塞问题

时间:2021-08-15 00:00:14

相关推荐

Java多线程-FutureTask的get方法阻塞问题

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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。