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
}}
任務執行過程中丟擲exceptionget方法會丟擲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...