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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lagom学习 四 CompletionStage

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lagom学习 四 CompletionStage 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Future:?Java 8 之前的 Java 版本功能較弱,僅支持兩種用法:要么檢查 future 是否已經完成,要么等待 future 完成;

Java 8 增加了?CompletableFuture<T>?類,它實現了新的?CompletionStage<T>?接口,并對?Future<T>進行了擴展。(都包含在?java.util.concurrent?包中。)CompletionStage?代表異步計算中的一個階段或步驟。該接口定義了多種不同的方式,將CompletionStage?實例與其他實例或代碼鏈接在一起,比如完成時調用的方法(一共 59 種方法,比Future?接口中的 5 種方法要多得多。)

CompletionStage?的接口一般都返回新的CompletionStage,表示執行完一些邏輯后,生成新的CompletionStage,構成鏈式的階段型的操作。

?

Java 1.5 有了?Future, 可謂是跨了一大步,繼而 Java 1.8 新加入一個 Future 的實現?CompletableFuture, 從此線程與線程之間可以愉快的對話了。最初兩個線程間的協調我采用過 Object 的 ?wait()?和?notify()?, Thread 的?join()?方法,那可算是很低級的 API 了,是否很多 Java 程序都不知道它們的存在,或根本沒用過它們。

如果是簡單的等待所有線程完成可使用 Java 1.5 的?CountDownLatch, 這里有一篇介紹?CountDownLatch 協調線程, 就是實現的 waitAll(threads) 功能。而 Java 8 的?CompletableFuture?的功能就多去,可簡單使用它實現異步方法。雖說?CompletableFuture?實現了?Future?接口,但它多數方法源自于?CompletionStage, 所以還里氏代換,用?Future?來引用?CompletableFuture?實例就很牽強了; 這也是為什么 PlayFramework 自 2.5 開始直接暴露的類型是?CompletionStage?而非其他兩個。

顧名思義,CompletableFuture 代表著一個 Future 完成后該干點什么,具體大致有:

  • Future 完成后執行動作,或求取下一個 Future 的值。then...
  • 多個 Future 的協調; 同時完成該怎么,其中一個完成該如何。allOf, anyOf
  • CompletableFuture?有太多太多的方法,并伴有?async?與 非?async?兩個版本。試想一下,如過不用?Future?或 ?CompletableFuture, 想要實現等待某個線程完成之后才做后續的事,可以用join或wait等。但是CompletableFuture更好。

    同步和異步:

    package completeFutture;import java.util.concurrent.CompletableFuture;public class Test {public static void main(String[] args) {CompletableFuture<Double> futurePrice = getPriceAsync();//do anything you want, 當前線程不被阻塞System.out.println(111);//線程任務完成的話,執行回調函數,不阻塞后續操作futurePrice.whenComplete((aDouble, throwable) -> {System.out.println(aDouble);//do something else });System.out.println(222);}static CompletableFuture<Double> getPriceAsync() {CompletableFuture<Double> futurePrice = new CompletableFuture<>();new Thread(() -> {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}futurePrice.complete(23.55);}).start();return futurePrice;} }

    輸出結果:

    111
    222
    23.55

    ?

    getPriceAsync() 模擬一個很耗時的操作,因為其行為是在一個線程中做的,所以不會阻塞打印 111的程序;
    getPriceAsync()中線程在執行完后才會把23.55賦值給futurePrice,所以futurePrice.whenComplete..要等待futurePrice.complete(23.55)執行完才會執行whenComplete。 注意whenComplete內部也是開新的線程執行,所以不會阻塞當前代碼,System.out.println(222)會被執行,最后當futurePrice.complete(23.55)執行完后, System.out.println(aDouble)會執行

    轉載于:https://www.cnblogs.com/liufei1983/p/8481251.html

    總結

    以上是生活随笔為你收集整理的Lagom学习 四 CompletionStage的全部內容,希望文章能夠幫你解決所遇到的問題。

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