FutureTask理解

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;下次再继续学习






猜你喜欢

转载自blog.csdn.net/hackland2012/article/details/71170443