Future獲取子執行緒的執行結果

2021-10-06 05:20:54 字數 4340 閱讀 3786

runnable的缺陷

@functionalinte***ce

public

inte***ce

runnable

callable介面
類似於runnable,被其他執行緒執行的任務

實現call方法,有返回值

@functionalinte***ce

public

inte***ce

callable

callable和future的關係
我們可以用future.get獲取callable介面返回的執行結果,還可以通過future.isdone()來判斷任務是否已經執行完了,以及取消這個任務,限時獲取任務的結果等

在call()未執行完畢之前,呼叫get()的執行緒會被阻塞,直到call()方法返回了結果後,此時future.get()才會得到該結果,然後主線程才會切換到runnable狀態。

所有future是乙個儲存器,它儲存了call()這個任務的結果,而這個任務的執行時間是無法提前確定的,因為這個完全取決於call()方法的執**況

future的主要方法

get()方法 獲取結果

get(long timeout,timeunit unit)

get方法的行為取決於callable任務的狀態,只有以下5中情況

cancel()
取消任務的執行

isdone()
判斷執行緒是否執行完畢,即使任務執行失敗,也可以算作執行完成。

iscancelled
判斷是否被取消

future**演示

執行緒池的sumbit方法返回future物件

我們給執行緒池提交任務後,執行緒池會立刻返回給我們乙個空的future容器。當我們可以獲取結果的時候,執行緒池便會把該結果填入到之前給我們的那個future中去。我們就可以從future中獲取任務的結果

public

class

futuredemo

; future

future = service.

submit

(callabletask)

;try

catch

(interruptedexception e)

catch

(executionexception e)

service.

shutdown();}}

future批量接收結果
public

class

futurearraydemo

for(

int i =

0; i <

10; i++

)catch

(interruptedexception e)

catch

(executionexception e)

}

service.

shutdown()

;}static

class

callabletask

implements

callable

}}

任務執行過程中丟擲exception
get方法會丟擲executionexception。不論call執行時丟擲的異常型別是什麼,最後get方法丟擲的異常型別都是executionexception.

public

class

futuredemo1

catch

(interruptedexception e)

catch

(executionexception e)

}static

class

callabletask

implements

callable

}}//executionexception

獲取任務超時
演示get的超時方法,需要注意超時後的處理,呼叫future.cancel().演示cancel傳入true和false的區別,判斷是否執行正在執行的任務

public

class

futuretasktimeout

@override

public string tostring()

';}}

static

class

fetchadtask

implements

callable

catch

(interruptedexception e)

return

newad

("獲取哈哈哈廣告");

}}public

void

printad()

ad = future.

get(

2,timeunit.seconds)

;/**

* future.cancel(false);

超時未獲取到廣告

cancel的結果 true

adfuture.cancel(true);

超時未獲取到廣告

cancel的結果 true

獲取廣告中線程中斷

ad* */

// ad = future.get(2,timeunit.seconds);

}catch

(interruptedexception e)

catch

(executionexception e)

catch

(timeoutexception e)

service.

shutdown()

; system.out.

println

(ad);}

public

static

void

main

(string[

] args)

}

cancel方法
future.cancel(true)

適用於任務能夠處理interrupt

future.cancel(false)

用futuretask來建立futrue
用futuretask來獲取futrue和任務的結果

futuretask是一種包裝器,可以把callable轉換成futrue和runnable,他實現了二者的介面

既可以作為runnable被執行緒執行,又可以作為future得到callable的返回值

**演示
放入執行緒池中去執行

public

class

futuretaskdemo

catch

(interruptedexception e)

catch

(executionexception e)}}

class

callabletask

implements

callable

return sum;

}}

放入執行緒池執行

public

class

futuretaskdemo

catch

(interruptedexception e)

catch

(executionexception e)}}

class

callabletask

implements

callable

return sum;

}}

注意

Springboot 多執行緒 等待獲取執行結果

在日常的開發專案過程中,時常會有多執行緒的使用場景。最近開發的需求中也是如此,只不過這次需要開啟多執行緒去執行,最後要等所有執行緒結束統一獲取結果。所以在此整理一下 在springboot專案中開啟非同步執行緒需要滿足一下幾點 因為需要開啟多執行緒非同步執行並獲取其返回結果,所以選用future作為...

獲取子執行緒的執行結果

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

如何獲取子執行緒的執行結果

對於執行緒的管理,我們不僅可以通過執行緒池進行管理,我們還可以通過future和callable進行管理。runnable介面無法返回乙個值返回。runnable介面原始碼 functionalinte ce public inte ce runnable runnable介面不能丟擲checked...