05 阻塞式和定時式哪種獲取任務的方式更好?

2022-10-09 00:36:09 字數 2356 閱讀 3712

上一節我們簡單的介紹一下future,這一節我們來介紹它裡面最常用的功能,那就是獲取任務執行結果的get方法。當我們通過submit的方法向執行緒池中提交乙個runnable任務或者是callable任務時,他們執行完會將結果封裝在物件中,然後再返回給呼叫者,呼叫者在通過future的get方法獲得結果。future是乙個介面,該介面定義與任務執行結果相關的功能。

如圖所示。這些主要是介紹獲取任務的功能。開始之前我先把兩個比較簡單的功能先介紹了,

就不再單獨介紹,乙個是iscancelled的方法,用於獲取任務是否取消,已取消返回true,否則返回false,還有乙個是isdone方法,用於獲取任務是否完成,完成返回true,否則返回false。這兩個方法還是用的比較多的。

下面著重來介紹這兩個獲取任務執行結果的方法。

首先來看無參的get方法,該方法作用是獲取任務執行結果,需要注意的是,它是乙個阻塞方法,也就是說獲取任務執行結果的執行緒會一直等到任務執行完畢,當任務執行完畢時,獲取任務執行結果的執行緒才會繼續往下執行。

任務執行過程中可能會發生一些異常,比如任務被取消時引發了異常,還有任務本身丟擲來異常,以及執行任務的執行緒被中斷時引發了異常。

下面我們來演示該方法,編寫乙個結果的任務,

任務內容是計算一加一的值,實現callable介面,加一的結果是整形,所以髮型的型別是integer,重寫call方法返回一加一的計算結果。至此方法編寫完成。

接下來我們來執行該任務,首先將任務建立出來,然後建立乙個執行緒池,這裡我們就以單個執行緒池為例

至此main方法並且完成整個例子,

並且完成執行程式,觀察執行結果。從執行結果來看,程式做出一加一的結果,二符合預期。關於這個方法大家需要注意一點,那就是她是阻塞的,很多人知道mian的方法可以獲取任務執行結果,但很容易忽略他會組成執行緒。

如果我們不想被無休止的住的話,那可以試試帶定時功能的方法,比如我們定時三秒鐘,如果三秒後還沒出結果,那就不等獲取任務的現場繼續往下執行,如果三秒內出結果,那我們就拿著結果繼續玩家執行

這樣執行緒就不會被無休止的阻塞住。同無參的get方法功能一樣,也是獲取任務執行結果,同樣是阻塞式的,只不過該方法有時間限制,超時則丟擲異常。它有兩個引數,第乙個引數timeout可以指定等待任務執行結果的最長時間,第二個引數因為指定cad的時間單位可以是時、分秒等,其他時間單位反饋的結果不用多說,任務執行的結果宣告的異常同無參的方法一樣,但比它多了乙個超時異常,當等待超時時引發該異常。下面我們來演示該方法。

改之前的我們再返回結果之前使當前執行緒等待三秒鐘。這樣做的目的是模擬執行時間長的任務使call方法有異常丟擲,因為call方法宣告了乙個異常,所以方法內部就不用捕獲了。

執行任務的**還是沿用之前的,只不過我們要給這個方法傳遞兩個引數,綜合前乙個引數就是等待時間為一秒,剛剛我們的任務執行時間是至少三秒,所以我們這裡定時一秒必然是等待超時。

帶定時功能的get方法會丟擲乙個超時異常,使用try---catch捕獲完成。

執行改寫後的程式,觀察執行結果。

從執行結果來看,程式發生超時異常符合預期。

再來看看未超時的情況,我們將超時時間一秒改為五秒,

改寫程式觀察執行結果,

從執行結果來看,程式這次沒有引發超時異常。帶參功能的方法相較於無參的方法來說,還是無參的方法,用的人更多,原因在於簡單,方便快捷,一般提交給執行緒的任務都會一直等到任務執行結果出來為止。

我在日常開發中用無參的get方法更多一些,最後總結一下本節內容。本節介紹獲取任務執行結果的方法,方法的用法和作用這裡就不再贅述。在實際開發中,無聲的方法用的更多。

阻塞式 非阻塞式IO

知識點 非阻塞式io 的兩種設定方法 1 函式fcntl 設定 o nonblock 選項 int flag fcntl sockfd,f getfl,0 檢查檔案標誌位 fcntl sockfd,f setfl,flag o nonblock 設定檔案標誌位 2 函式ioctl 設定fionbio...

阻塞式Socket VS 非阻塞式Socket

主要有三種型別的socket,永久阻塞模式 阻塞加超時模式和非阻塞式。socket模式可以通過apr socket opt set 和apr socket timeout set 這兩個api控制。在windows和unix系統上預設的socket是永久阻塞模式 apr so nonblock ti...

什麼是阻塞式和非阻塞io流

阻塞io socket 的阻塞模式意味著必須要做完io 操作 包括錯誤 才會返回。非阻塞io 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功。兩者區別 所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待 狀態...