# futuretask實際上執行還是乙個runnable,它對callable做了乙個封裝,讓開發人員可以從其中獲取返回值;
futruetask是有狀態的 共7種狀態,四種狀態變換的可能
new -> completing -> exceptional
new -> cancelled
new -> completing -> normal
new -> interrupting -> interrupted
0. 通過call方法呼叫;
1. 有返回值
2. 可以拋異常
1. 判斷狀態;
2. 非new,completing狀態則直接 進入report返回結果;
3. 處於new,completing狀態,則進入等待awaitdone();
3.1. 獲取等待的超時時間deadline;
3.2. 進入自旋
3.3. 判斷執行緒是否被中斷:如果被中斷則移出等待waiters佇列;並丟擲異常;
3.4. 判斷futruetask狀態:如果">completing",代表執行完成,進入report;
3.5. 判斷futruetask狀態:如果"=completing",讓出cpu執行thread.yield();
3.6. 為當前執行緒建立乙個node節點;
3.7. 將當前執行緒waitnode加入等待佇列waiters中;
3.8. 判斷是否超時;
3.9. 通過locksupport.park掛起執行緒,等待執行許可;
4. report返回執行結果:如果一切正常就返回執行結果,否則返回exception;
1. 判斷狀態是否正常,避免重複執行;
2. 呼叫callable的call()方法;
3. 修改執行狀態;儲存執行結果;並通知正在等待get的執行緒;
## 3.x通知機制finishcompletion
3.1. 獲取所有waiters的集合;
3.2. 通過cas 拿到執行權;
3.3. 迴圈遍歷所有等待的執行緒,通過locksupport.unpark 喚醒其執行;
public boolean cancel(boolean mayinterruptifrunning) finally
}} finally
return true;
}
public void run() catch (throwable ex)
// 如果執行成功,修改狀態為正常,並通知其他在等待結果的執行緒
if (ran)
set(result);
}} finally
}
public v get() throws interruptedexception, executionexception
private v report(int s) throws executionexception
private int awaitdone(boolean timed, long nanos)
throws interruptedexception
int s = state;
// 如果狀態非初創或執行完畢了,則跳出迴圈,通過report()取執行結果
if (s > completing)
// 如果狀態等於已執行,讓出cpu執行,等待狀態變為正常結束
else if (s == completing) // cannot time out yet
thread.yield();
// 如果當前執行緒還沒有建立物件的waitnode節點,則建立乙個
else if (q == null)
q = new waitnode();
// 如果當前執行緒對應的waitnode還沒有加入到等待鍊錶中,則加入進去;
else if (!queued)
queued = unsafe.compareandswapobject(this, waitersoffset,
q.next = waiters, q);
// 如果有設定等待超時時間,則通過parknanos掛起當前執行緒,等待繼續執行的訊號
else if (timed)
locksupport.parknanos(this, nanos);
}// 通過park掛起當前執行緒,等待task執行結束後給它發乙個繼續執行的訊號(unpark)
else
locksupport.park(this);
}}
private void finishcompletion()
waitnode next = q.next;
if (next == null)
break;
q.next = null; // unlink to help gc
q = next;
}break;}}
done();
callable = null; // to reduce footprint
}
FutureTask原始碼分析
futuretask實現了runnablefuture,runnablefuture繼承了runnable和future介面。future介面和實現future介面的futuretask類,代表非同步計算的結果。所以futuretask既能當做乙個runnable直接被thread執行,也能作為fu...
FutureTask原始碼分析
private volatile int state 任務狀態 private static final int new 0 private static final int completing 1 private static final int normal 2 private static ...
FutureTask 原始碼閱讀
public void run catch throwable ex if ran set result finally get操作的核心方法 private intawaitdone boolean timed,long nanos throws interruptedexception int ...