Future, FutureTask的作用和差異

2021-07-23 04:31:31 字數 2289 閱讀 9056

future是乙個介面,表示乙個任務的週期,並提供了相應的方法來判斷是否已經完成或者取消任務,以及獲取任務的結果和取消任務。

下面根據future的定義介紹一下相關的介面

1. boolean cancel(boolean mayinterruptifrunning);

取消任務.

fail的情況:任務已經完成,已經被取消過了,無法取消。

success的情況:任務還沒有開始執行,其他由引數mayinterruptifrunning決定。

若mayinterruptifrunning為true,任務不可以被打斷。

否則就可以允許完成。

當該方法被執行過之後,isdone()的結果輸出一直為true.

如果該方法return true,iscancelled的結果輸出一直為true.

return:false,如果任務不能被取消一般是因為已經被正常執行。

2.  boolean iscancelled();

檢測在任務正常執行之前是否被取消。

3.   boolean isdone();

return true is this task completed.

任務的完成包括正常的結束,exception,和取消。

4. v get() throws interruptedexception, executionexception;

阻塞等待任務完成,並獲取計算結果。

@throws cancellationexception if the computation was cancelled

@throws executionexception if the computation threw an exception

@throws interruptedexception if the current thread was interrupted  while waiting

5. v get(long timeout, timeunit unit)

throws interruptedexception, executionexception, timeoutexception;

阻塞等待任務完成或者timeout的時間到了,然後獲取計算結果。

@param timeout the maximum time to wait

@param unit the time unit of the timeout argument

@return the computed result

@throws cancellationexception if the computation was cancelled

@throws executionexception if the computation threw an exception

@throws interruptedexception if the current thread was interrupted while waiting

@throws timeoutexception if the wait timed out

future是乙個介面,futuretask是future的乙個實現類,並實現了runnable,因此futuretask可以傳遞到執行緒物件thread中新建乙個執行緒執行。所以可以通過excutor(執行緒池)來執行,也可傳遞給thread物件執行。

如果在主線程中需要執行比較耗時的操作,但又不想阻塞主線程時,可以把這些作業交給future物件在後台完成,當主線程將來需要時,就可以通過future物件獲得後台作業的計算結果或者執行狀態。 

futuretask是為了彌補thread的不足而設計的,它可以讓程式設計師準確地知道執行緒什麼時候執行完成並獲得到執行緒執行完成後返回的結果(如果有需要)。

futuretask是一種可以取消的非同步的計算任務。它的計算是通過callable實現的,它等價於可以攜帶結果的runnable,並且有三個狀態:等待、執行和完成。完成包括所有計算以任意的方式結束,包括正常結束、取消和異常。

executor框架利用futuretask來完成非同步任務,並可以用來進行任何潛在的耗時的計算。一般futuretask多用於耗時的計算,主線程可以在完成自己的任務後,再去獲取結果。

jdk:

此類提供了對 future 的基本實現。僅在計算完成時才能檢索結果;如果計算尚未完成,則阻塞 get 方法。一旦計算完成,就不能再重新開始或取消計算。

可使用 futuretask 包裝 callable 或 runnable 物件。因為 futuretask 實現了 runnable,所以可將 futuretask 提交給 executor 執行。

參考文章:  

標準差 標準誤 偏度係數和峰度係數的作用

標準差和標準誤是兩個不同的概念,標準差就是乙個變數的所有資料的離均差平方和再平均之後開平方,它是度量離散程度的指標。標準誤用於估計引數的可信區間,進行假設檢驗等。它們與樣本含量的關係不同 當樣本含量 n 足夠大時,標準差趨向穩定 而標準誤隨n的增大而減小,甚至趨於0 聯絡 標準差,標準誤均為變異指標...

樹上差分的整理(點的樹上差分和邊的樹上差分)

點的樹上差分 若經過 u 到 v 的所有點,tmp u tmp v tmp lca u,v tmp parent lca u,v 0 例題 include using namespace std struct ss ss data 600010 int n,q int a 300010 head 6...

java bufferedread的作用和用法

可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。通常,reader 所作的每個讀取請求都會導致對底層字元或位元組流進行相應的讀取請求。因此,建議用 bufferedreader 包裝所有其 read 操作可能開銷很高的 reader 如 filereader 和 inpu...