FutureTask詳解以及實現

2021-10-24 07:05:49 字數 3280 閱讀 8328

我們先來看一下futuretask的實現:

publicclassfuturetaskimplementsrunnablefuture

futuretask類實現了runnablefuture介面,我們看一下runnablefuture介面的實現:

publicinte***cerunnablefutureextendsrunnable, future

可以看出runnablefuture繼承了runnable介面和future介面,而futuretask實現了runnablefuture介面。所以它既可以作為runnable被執行緒執行,又可以作為future得到callable的返回值。

futuretask提供了2個構造器:

publicfuturetask(callablecallable)

publicfuturetask(runnable runnable, v result)

事實上,futuretask是future介面的乙個唯一實現類。

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

當乙個執行緒需要等待另乙個執行緒把某個任務執行完後它才能繼續執行,此時可以使用futuretask。假設有多個執行緒執行若干任務,每個任務最多只能被執行一次。當多個執行緒試圖同時執行同乙個任務時,只允許乙個執行緒執行任務,其他執行緒需要等待這個任務執行完後才能繼續執行。下面是對應的示例**。

private final concurrentmap> taskcache = new concurrenthashmap<>();

private string executiontask(final string taskname)throws executionexception, interruptedexception

}try catch (cancellationexception e) }}

public class threadtest );

//實質還是以callable物件來建立並啟動執行緒

//輸出 新執行緒   開始執行任務!

new thread(task,"新執行緒").start();

trycatch (exception ex)​}

}jdk1.8的futuretask有個說明:

修訂說明:這與這個類以前依賴abstractqueuedsynchronizer的版本不同,主要是為了避免在取消競爭期間保留中斷狀態讓使用者感到意外。在當前的設計中,sync控制項依賴於通過cas更新的「state」欄位來跟蹤完成,以及乙個簡單的treiber堆疊來儲存等待的執行緒。

風格注意:與往常一樣,我們繞過了使用 atomicxfieldupdaters的開銷,而是直接使用unsafe。

futuretask實現了future介面,future介面有5個方法:

1、boolean cancel(boolean mayinterruptifrunning)

嘗試取消當前任務的執行。如果任務已經取消、已經完成或者其他原因不能取消,嘗試將失敗。如果任務還沒有啟動就呼叫了cancel(true),任務將永遠不會被執行。如果任務已經啟動,引數mayinterruptifrunning將決定任務是否應該中斷執行該任務的執行緒,以嘗試中斷該任務。

如果任務不能被取消,通常是因為它已經正常完成,此時返回false,否則返回true

2、boolean iscancelled()

如果任務在正常結束之前被被取消返回true

3、boolean isdone()

正常結束、異常或者被取消導致任務完成,將返回true

4、v get()

等待任務結束,然後獲取結果,如果任務在等待過程中被終端將丟擲interruptedexception,如果任務被取消將丟擲cancellationexception,如果任務中執行過程中發生異常將丟擲executionexception。

5、v get(long timeout, timeunit unit)

任務最多在給定時間內完成並返回結果,如果沒有在給定時間內完成任務將丟擲timeoutexception。

futuretask有以下7中狀態:

futuretask任務的執行狀態,最初為new。執行狀態僅在set、setexception和cancel方法中轉換為終端狀態。在完成過程中,狀態可能呈現出瞬時值interrupting(僅在中斷執行程式以滿足cancel(true)的情況下)或者completing(在設定結果時)狀態時。從這些中間狀態到最終狀態的轉換使用成本更低的有序/延遲寫,因為值是統一的,需要進一步修改。

state:表示當前任務的執行狀態,futuretask的所有方法都是圍繞state開展的,state宣告為volatile,保證了state的可見性,當對state進行修改時所有的執行緒都會看到。

new:表示乙個新的任務,初始狀態

completing:當任務被設定結果時,處於completing狀態,這是乙個中間狀態。

normal:表示任務正常結束。

exceptional:表示任務因異常而結束

cancelled:任務還未執行之前就呼叫了cancel(true)方法,任務處於cancelled

interrupting:當任務呼叫cancel(true)中斷程式時,任務處於interrupting狀態,這是乙個中間狀態。

interrupted:任務呼叫cancel(true)中斷程式時會呼叫interrupt()方法中斷執行緒執行,任務狀態由interrupting轉變為interrupted

可能的狀態過渡:

1、new -> completing -> normal:正常結束

2、new -> completing -> exceptional:異常結束

3、new -> cancelled:任務被取消

4、new -> interrupting -> interrupted:任務出現中斷

FutureTask原始碼詳解 JDK1 8

jdk1.8修改了futuretask的實現,jkd1.8不再依賴aqs來實現,而是通過乙個volatile變數state以及cas操作來實現。1 繼承結構 2 state欄位 volatile修飾的state欄位 3 其他變數 runner和waiters為volatile型別 4 構造器 5 c...

NFS搭建以及rsync inotify實時備份

搭建nfs 假設有2臺server,分別是server1和server2。現在要在server1上安裝nfs,在server2上掛載該目錄。1.在兩台server上都安裝 yum install portmap nfs utils nfs utils lib 2.編輯server1檔案 etc ex...

guava Objects的常用用法以及實現

objects主要用來重寫tostring和hashcode方法。裡面還有乙個方法firstnonnull t,t 返回兩個值中不為null的乙個如果都位null.丟擲空指標異常。上 看用法 import com.google.common.base.objects public class obj...