日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java8 - Future 接口

發布時間:2025/3/21 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java8 - Future 接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 并行 VS 并發
  • Future接口
  • 使用 Future 以異步的方式執行一個耗時的操作
  • Future接口的局限性


Pre

并不希望因為等待某些服務的響應,阻塞應用程序的運行,浪費CPU時鐘周期。

這些場景體現了多任務程序設計的另一面。我們前面學習的分支/合并框架以及并行流是實現并行處理的寶貴工具;它們將一個操作分為多個子操作,在多個不同的核、CPU甚至是機器上并行地執行這些子操作。

與此相反,如果你的意圖是實現并發,而非并行,或者你的主要目標是在同一個CPU上執行幾個松耦合的任務,充分利用CPU的核,讓其足夠忙碌,從而最大化程序的吞吐量,那么你其實真正想做的是避免因為等待遠程服務的返回,或者對數據庫的查詢,而阻塞線程的執行,浪費寶貴的計算資源,因為這種等待的時間很可能相當長。

Future 接口,尤其是它的新版實現 CompletableFuture ,是處理這種情況的利器 .

并行 VS 并發


Future接口

Future 接口在Java 5中被引入,設計初衷是對將來某個時刻會發生的結果進行建模。它建模了一種異步計算,返回一個執行運算結果的引用,當運算結束后,這個引用被返回給調用方。

在Future 中觸發那些潛在的耗時的操作把調用線程解放出來,讓它能繼續執行其他有價值的工作,不再需要呆呆的等待耗時的操作完成。

打個比方,你可以把它想象成這樣的場景:你拿了一袋子衣服到干洗店洗。干洗店的員工會給你張發票,告訴你什么時候你的衣服會洗好(這就是一個 Future 事件) 。 衣服干洗的同時,你可以去做其他的事情。

Future 的另一個優點是它比更底層的 Thread 更易用。要使用 Future ,通常你只需要將耗時的操作封裝在一個 Callable 對象中,再將它提交給 ExecutorService ,就OK了。

來看下例子

import java.util.concurrent.*;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/4/5 9:47* @mark: show me the code , change the world*/ public class FutureTest {public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {ExecutorService executorService = Executors.newSingleThreadExecutor();Future<String> future = executorService.submit(() -> {try {TimeUnit.SECONDS.sleep(2);return "I'm OK ";} catch (InterruptedException e) {return "I'm Error ";}});while(!future.isDone()){Thread.sleep(10);}// 超時時間的阻塞// future.get(10,TimeUnit.SECONDS);// 調用get 阻塞System.out.println(future.get());executorService.shutdown();} }

使用 Future 以異步的方式執行一個耗時的操作

這種編程方式讓你的線程可以在 ExecutorService 以并發方式調用另一個線程執行耗時操作的同時,去執行一些其他的任務。

接著,如果你已經運行到沒有異步操作的結果就無法繼續任何有意義的工作時,可以調用它的 get 方法去獲取操作的結果。

如果操作已經完成,該方法會里立刻返回操作的結果,否則它會阻塞你的線程,直到操作完成,返回相應的結果。

你能想象這種場景存在怎樣的問題嗎?如果該長時間運行的操作永遠遠不返回了會怎樣?為了處理這種可能性,雖然 Future 提供了一個無需任何參數的 get 方法,我們還是推薦大家使用重載版本的 get 方法,它接受一個超時的參數,通過它,你可以定義你的線程等待 Future 結果的最長時間,而不是一直等待下去。

【使用 Future 以異步方式執行長時間的操作】


Future接口的局限性

通過上面的例子,我們知道 Future 接口提供了方法來檢測異步計算是否已經結束(使用isDone 方法),等待異步操作結束 ,以及獲取計算的結果。

但是這些特性還不足以讓你編寫簡潔的并發代碼。比如,我們很難表述 Future 結果之間的依賴性;從文字描述上這很簡單,“當長時間計算任務完成時,請將該計算的結果通知到另一個長時間運行的計算任務,這兩個計算任務都完成后,將計算的結果與另一個查詢操作結果合并”。

但是,使用 Future 中提供的方法完成這樣的操作又是另外一回事。這也是我們需要更具描述能力的特性的原因,比如下面這些。

  • 將兩個異步計算合并為一個——這兩個異步計算之間相互獨立,同時第二個又依賴于第一個的結果
  • 等待 Future 集合中的所有任務都完成。
  • 僅等待 Future 集合中最快結束的任務完成(有可能因為它們試圖通過不同的方式計算同一個值),并返回它的結果。
  • 通過編程方式完成一個 Future 任務的執行(即以手工設定異步操作結果的方式)。
  • 應對 Future 的完成事件(即當 Future 的完成事件發生時會收到通知,并能使用 Future計算的結果進行下一步的操作,不只是簡單地阻塞等待操作的結果)。

了解新的 CompletableFuture 類(它實現了 Future 接口)如何利用Java 8的新特性以更直觀的方式將上述需求都變為可能。

Stream 和 CompletableFuture 的設計都遵循了類似的模式:它們都使用了Lambda表達式以及流水線的思想。

從這個角度,你可以說CompletableFuture 和 Future 的關系就跟 Stream 和 Collection 的關系一樣。

總結

以上是生活随笔為你收集整理的Java8 - Future 接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。