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