概述 Future表示一个任务的生命周期,是一个可取消的异步运算,可以把它看作是一个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对结果的访问。 FutureTask为Future提供了基础实现,如获取任务执行结果何取消任务等。如果尚未完成,获取任务执行结果的线程会被阻塞,一旦执行结束,任务就不能被重启或取消。FutureTask常用来封装Clallable和Runnable,也可以作为一个任务提交到线程池中执行。
FutureTask内部维护了一个由volatule修饰的int型变量-state,待变当前任务的运行状态,state有7种状态。
NEW:新建
COMPLETING:完成
NORMAL:正常运行
EXCEPTIONAL:异常退出
CANCELLED:任务取消
INTERRUPTING:线程中断中。
INTERRUPTED:线程已中断
源码分析 继承体系
核心属性 1 2 3 4 5 6 7 8 private Callable<V> callable;private Object outcome; private volatile Thread runner;private volatile WaitNode waiters;
重要方法分析 fun方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public void run () { if (state != NEW || !UNSAFE.compareAndSwapObject(this , runnerOffset, null , Thread.currentThread())) return ; try { Callable <V> c = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true ; } catch (Throwable ex) { result = null ; ran = false ; setException(ex); } if (ran) set(result); } } finally { runner = null ; int s = state; if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }
运行任务,如果任务状态为NEW状态,则利用CAS修改为当前线程,执行完毕后调用set方法设置执行的结果。
set方法 1 2 3 4 5 6 7 8 9 10 protected void set (V v) { if (UNSAFE.compareAndSwapInt(this , stateOffset, NEW, COMPLETING)) { outcome = v; UNSAFE.putOrderedInt(this , stateOffset, NORMAL); finishCompletion(); } }
set方法主要是修改状态为完成态,获得结果,设置为结束状态。然后调用finishCompletion方法唤醒等待结果的线程。
finishCompletion 该方法的主要作用就是唤醒所有等待结果的线程来取结果了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 private void finishCompletion () { for (WaitNode q; (q = waiters) != null ;) { if (UNSAFE.compareAndSwapObject(this , waitersOffset, q, null )) { for (;;) { Thread t = q.thread; if (t != null ) { q.thread = null ; LockSupport.unpark(t); } WaitNode next = q.next; if (next == null ) break ; q.next = null ; q = next; } break ; } } done(); callable = null ; }
get方法 get方法是去获取结果,如果运行还没有结果,那么就会阻塞。
1 2 3 4 5 6 7 8 public V get () throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false , 0L ); return report(s); }
这个地方调用awaitDone方法
report方法1 2 3 4 5 6 7 8 9 10 private V report (int s) throws ExecutionException { Object x = outcome; if (s == NORMAL) return (V)x; if (s >= CANCELLED) throw new CancellationException (); throw new ExecutionException ((Throwable)x); }
awaitDone方法 awaitDone方法用于等待任务完成,或者因为任务中断或超时而终止。返回任务的完成状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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) Thread.yield (); else if (q == null ) q = new WaitNode (); else if (!queued) queued = UNSAFE.compareAndSwapObject(this , waitersOffset, q.next = waiters, q); else if (timed) { nanos = deadline - System.nanoTime(); if (nanos <= 0L ) { removeWaiter(q); return state; } LockSupport.parkNanos(this , nanos); } else LockSupport.park(this ); } }