深入理解併發程式設計 FutureTask

2021-10-05 06:43:20 字數 2986 閱讀 1891

本文為讀書筆記

可參考:futuretask jdk8實現

jkd1.8不再依賴aqs來實現,而是用的cas+state

2. futuretask的使用

3. futuretask的實現(jkd1.8不再依賴aqs來實現)

4. 使用舉例

future介面和實現future介面的futuretask類,代表非同步計算的結果。

此任務的執行狀態,最初是新的。執行狀態只有在方法集中才會過渡到終端狀態, setexception和cancel。在完成期間,state可能會承擔暫態值的完成(而結果正在被設定)或中斷(僅在中斷跑步者以滿足a時)取消(真))。從這些中間過渡到最終狀態使用更便宜的有序/惰性寫,因為值是唯一的無法進一步修改。

//注意關鍵字state

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;

根據futuretask.run()方法被執行的時機,futuretask可以處於下面3種狀態。

1)未啟動。futuretask.run()方法還沒有被執行之前,futuretask處於未啟動狀態。當建立乙個futuretask,且沒有執行futuretask.run()方法之前,這個futuretask處於未啟動狀態。

2)已啟動。futuretask.run()方法被執行的過程中,futuretask處於已啟動狀態。

3)已完成。futuretask.run()方法執行完後正常結束,或被取消(futuretask.cancel(…)),或執行futuretask.run()方法時丟擲異常而異常結束,futuretask處於已完成狀態。

可以把futuretask交給executor執行;也可以通過executorservice.submit(…)方法返回乙個futuretask,然後執行futuretask.get()方法或futuretask.cancel(…)方法。除此以外,還可以單獨使用futuretask。

當乙個執行緒需要等待另乙個執行緒把某個任務執行完後它才能繼續執行,此時可以使用futuretask。

假設有多個執行緒執行若干任務,每個任務最多只能被執行一次。當多個執行緒試圖同時執行同乙個任務時,只允許乙個執行緒執行任務,其他執行緒需要等待這個任務執行完後才能繼續執行。

部分核心方法:

文章應該是1.8以前:

futuretask的 實 現 基 於abstractqueuedsynchronizer(以 下 簡 稱 為aqs)。

設計示意圖:

;//交給thread執行

thread thread =

newthread

(task)

; thread.

start()

;

integer result = null;

trycatch

(interruptedexception e)

catch

(executionexception e)

system.out.

println

("結果為:"

+ result)

;}

public

static

void

main

(string[

] args)

throws executionexception, interruptedexception

class

cimplements

callable

}

或者

future submit = executorservice.

submit

(c);

system.out.

println

(submit.

get())

; executorservice.

shutdownnow()

;

併發程式設計之深入理解Lock介面

寫乙個執行緒不安全的 public class unsafethread public static void main string args catch interruptedexception e countdownlatch.countdown start while true 這裡的cou...

java高併發程式設計之深入理解Thread建構函式

2.1 執行緒的命名 構造中含有string name引數的就表示執行緒的名字。還可以呼叫thread 類的setname 方法重新命名 2.2 執行緒的父子關係 thread的所有建構函式,最終都會去呼叫乙個靜態方法init.private void init threadgroup g,runn...

深入理解網路程式設計(二)

深入理解網路程式設計 二 1 socket程式設計 serversocket 方法 socket accept 如果接收到乙個客戶端socket的連線請求,該方法將返回乙個與連線客戶端socket對應的socket serversocket int port serversocket int por...