FutureTask原始碼分析

2021-09-29 11:34:00 字數 3849 閱讀 7270

futuretask實現了runnablefuture,runnablefuture繼承了runnable和future介面。future介面和實現future介面的futuretask類,代表非同步計算的結果。所以futuretask既能當做乙個runnable直接被thread執行,也能作為future用來得到非同步計算的結果。

public

static

class

myfuturetask

implements

callable

}public

static

void

main

(string[

] args)

throws executionexception, interruptedexception

/**

* 物件的狀態

* new -> completing -> normal 任務正常執行並返回

* new -> completing -> exceptional 執行**現異常

* new -> cancelled 任務執行過程中被取消,並且不響應中斷

* new -> interrupting -> interrupted 任務執行過程中被取消,並且響應中斷

*/private

volatile

int state;

// 物件狀態

private

static

final

int new =0;

// 任務新建和執行中

private

static

final

int completing =1;

// 任務將要執行完畢

private

static

final

int normal =2;

// 任務正常執行結束

private

static

final

int exceptional =3;

// 任務異常

private

static

final

int cancelled =4;

// 任務取消

private

static

final

int interrupting =5;

// 任務執行緒即將被中斷

private

static

final

int interrupted =6;

// 任務執行緒已中斷

// 使用者提交的任務

private callable

callable;

// 任務的執行結果

private object outcome;

// non-volatile, protected by state reads/writes

// 執行任務的執行緒

private

volatile thread runner;

// 等待節點,儲存的是呼叫get()而被阻塞的執行緒

private

volatile waitnode waiters;

// 內部類

static

final

class

waitnode

}// 建構函式

public

futuretask

(callable

callable)

public

futuretask

(runnable runnable, v result)

// 執行緒啟動之後,最後會呼叫futuretask的run方法

public

void

run(

)catch

(throwable ex)

if(ran)

set(result)

;// 任務執行完成,設定任務的返回結果}}

finally

}// 設定異常資訊

protected

void

setexception

(throwable t)

}// 設定返回結果

protected

void

set(v v)

}private

void

finishcompletion()

waitnode next = q.next;

// 獲取下乙個呼叫get()方法的執行緒

if(next == null)

break

; q.next = null;

// unlink to help gc

q = next;

}break;}

}// 鉤子方法,由子類重寫的,在futuretask裡面什麼也沒做

done()

;// 任務置空

callable = null;

// to reduce footprint

}// 使用者獲取任務返回結果

public v get()

throws interruptedexception, executionexception

private

intawaitdone

(boolean timed,

long nanos)

throws interruptedexception

int s = state;

if(s > completing)

// 如果狀態等於completing,說明任務快完成了,就差設定狀態到normal或exceptional和設定結果了

// 這時候就讓出cpu,優先完成任務

else

if(s == completing)

// cannot time out yet

thread.

yield()

;else

if(q == null)

q =newwaitnode()

;// 如果q為null,說明當前執行緒第一次進入for迴圈

elseif(

!queued)

// 如果當前執行緒沒有進入waiters佇列,則嘗試入隊

queued = unsafe.

compareandswapobject

(this

, waitersoffset,

q.next = waiters, q)

;else

if(timed)

locksupport.

parknanos

(this

, nanos);}

else

locksupport.

park

(this);

// 阻塞當前執行緒,等待被喚醒}}

private v report

(int s)

throws executionexception

實現callable介面並構造乙個futuretask物件。

執行緒啟動之後會呼叫futuretask的run方法,run方法會執行我們實現的call方法,任務執行完成後將會設定任務的返回結果,並喚醒waiters佇列裡面的執行緒。

使用者呼叫futuretask的get()方法獲取任務的執行結果,若任務還沒有執行完成,則將當前執行緒放到等待佇列waiters並阻塞當前執行緒。任務執行完畢後,waiters裡面的執行緒將會被喚醒。

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原始碼分析筆記

futuretask實際上執行還是乙個runnable,它對callable做了乙個封裝,讓開發人員可以從其中獲取返回值 futruetask是有狀態的 共7種狀態,四種狀態變換的可能 new completing exceptional new cancelled new completing n...

FutureTask 原始碼閱讀

public void run catch throwable ex if ran set result finally get操作的核心方法 private intawaitdone boolean timed,long nanos throws interruptedexception int ...