多執行緒獲取執行結果Callable和Future

2021-10-05 05:07:02 字數 2786 閱讀 3227

@functionalinte***ce

public

inte***ce

callable

可以看到,與runnable介面不同之處在於,call方法帶有泛型返回值v。

常用方法

v get() :獲取非同步執行的結果,如果沒有結果可用,此方法會阻塞直到非同步計算完成。

v get(long timeout , timeunit unit) :獲取非同步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,如果阻塞時間超過設定的timeout時間,該方法將丟擲異常。

boolean isdone() :如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回true。

boolean iscanceller() :如果任務完成前被取消,則返回true。

boolean cancel(boolean mayinterruptrunning) :如果任務還沒開始,執行cancel(…)方法將返回false;如果任務已經啟動,執行cancel(true)方法將以中斷執行此任務執行緒的方式來試圖停止任務,如果停止成功,返回true;當任務已經啟動,執行cancel(false)方法將不會對正在執行的任務執行緒產生影響(讓執行緒正常執行到完成),此時返回false;當任務已經完成,執行cancel(…)方法將返回false。mayinterruptrunning引數表示是否中斷執行中的執行緒。

通過方法分析我們也知道實際上future提供了3種功能:(1)能夠中斷執行中的任務(2)判斷任務是否執行完成(3)獲取任務執行完成後額結果。

我們通過簡單的例子來體會使用callable和future來獲取任務結果的用法。

public

class

threaddemo01

catch

(interruptedexception e)

catch

(executionexception e)

system.out.

println

(integer)

;// 關閉執行緒池

if(executor != null)

executor.

shutdown()

;}}class

addnumbertask

implements

callable

@override

public integer call()

throws exception

}

結果:

main執行緒執行其他任務

####addnumbertask###call()

5000

公共資料介面,futuredata和realdata都要實現。

public

inte***ce

data

futuredata,當有執行緒想要獲取realdata的時候,程式會被阻塞。等到realdata被注入才會使用getrequest()方法。

public

class

fururedata

implements

data

// 如果沒有獲取到資料,傳遞真是物件

this

.realdata = realdata;

isflag =

true

;// 進行通知

notify()

;}@override

public

synchronized string getrequest()

catch

(exception e)

}// 獲取到資料,直接返回

return realdata.

getrequest()

;}}

真實資料realdata

public

class

realdata

implements

data

catch

(exception e)

system.out.

println

("realdata獲取操作完畢,獲取結果...");

result =

"realdate";}

@override

public string getrequest()

}

futureclient 客戶端

public

class

futureclient})

.start()

;return fururedata;

}}

呼叫者:

public

class

main

}

結果:

請求傳送成功!

執行其他任務...

阻塞中返回的是fururedata

正在使用data:請求引數.網路請求資料,耗時操作需要等待.

realdata獲取操作完畢,獲取結果...

獲取到結果.

..realdate

呼叫者請求資源,client.request(「name」); 完成對資料的準備

當要獲取資源的時候,data.getrequest() ,如果資源沒有準備好isflag = false;那麼就會阻塞該執行緒。直到資源獲取然後該執行緒被喚醒。

多執行緒 批量獲取多條執行緒的執行結果

當向執行緒池提交callable任務後,我們可能需要一次性獲取所有返回結果,有三種處理方法。建立乙個執行緒池 executorservice executorservice executors.newfixedthreadpool 10 儲存執行結果的list list results new ar...

獲取執行緒的執行結果

最本質的區別在於,runnable沒有返回結果,callable會有乙個返回結果,返回結果是泛型,可以自己定義。舉例子說明 上述例子中可以看到,callable可以定義乙個返回結果,通過futuretask的get方法可以獲得執行緒執行後的結果 阻塞等待結果 原始碼檢視 allocates a ne...

獲取子執行緒的執行結果

public class thread implements runnable private static class task implements callable public static void main string args throws executionexception,in...