FutureTask理解

xiaoxiao2021-02-27  307

futreTask实现了 Future<V>与Runnable接口;

今天主要是我想学习与了解一下关于future的使用;

future的作用是异步获取线程的执行结果;看他是怎么实现的;

  /**      * @throws CancellationException {@inheritDoc}      */     public V get() throws InterruptedException, ExecutionException {  1       int s = state;   2      if (s <= COMPLETING)   3          s = awaitDone(false, 0L);   4      return report(s);     }

2判断线程的状态没有完成时进入awaitDone()方法;

完成后,直接report(s);先分析report()方法,源码如下:

@SuppressWarnings("unchecked")     private V report(int s) throws ExecutionException { 5        Object x = outcome;  6       if (s == NORMAL)   7          return (V)x;   8      if (s >= CANCELLED)   9          throw new CancellationException();   10      throw new ExecutionException((Throwable)x);     }

第6行代码判断当状态炒normal时(备注:normal代码线程体正常执行完)时返回outcome;否则,抛出异常;

现在在查看awaitDone()方法,按字面意思可解释为等待完成;

 private int awaitDone(boolean timed, long nanos)         throws InterruptedException {     11    final long deadline = timed ? System.nanoTime() + nanos : 0L;      12   WaitNode q = null;     13    boolean queued = false;      14   for (;;) {      15      if (Thread.interrupted()) {      16          removeWaiter(q);      17         throw new InterruptedException();      18       }      19       int s = state;       20      if (s > COMPLETING) {       21          if (q != null)       22             q.thread = null;       23          return s;       24      }       25      else if (s == COMPLETING) // cannot time out yet       26         Thread.yield();       27      else if (q == null)       28         q = new WaitNode();       29      else if (!queued)       30         queued = UNSAFE.compareAndSwapObject(this, waitersOffset,                                                      q.next = waiters, q);       31      else if (timed) {       32          nanos = deadline - System.nanoTime();       33          if (nanos <= 0L) {       34              removeWaiter(q);       35              return state;        36         }        37         LockSupport.parkNanos(this, nanos);             }         38    else         39       LockSupport.park(this);         }     }

第15-18行,如果中断线程,抛出异常;

;第20-24行,如果正常执行完直接返回state s;

第25-26行,如果状态正在完成中,只需通过yield方法,让出cpu资源,等待其变成normal状态;

第29-30将当前线程放在等待线程队列中;

第39行,是阻塞当前线程;

总结:get的作用主要获取得线程的执行结果,根据线程状态state的值来进行判断,如果正在进行中,就继续阻塞;

有几个方法要注意像lockSupport.park();(线程阻塞),创建等待线程队列 UNSAFE.compareAndSwapObject;下次再继续学习

转载请注明原文地址: https://www.6miu.com/read-3926.html

最新回复(0)