FutureTask原始碼分析筆記

2021-09-13 22:28:29 字數 2693 閱讀 5106

# 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 ...