日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Lagom学习 四 CompletionStage

發(fā)布時(shí)間:2023/12/10 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lagom学习 四 CompletionStage 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

CompletionStage?的接口一般都返回新的CompletionStage,表示執(zhí)行完一些邏輯后,生成新的CompletionStage,構(gòu)成鏈?zhǔn)降碾A段型的操作。

?

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

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

顧名思義,CompletableFuture 代表著一個(gè) Future 完成后該干點(diǎn)什么,具體大致有:

  • Future 完成后執(zhí)行動(dòng)作,或求取下一個(gè) Future 的值。then...
  • 多個(gè) Future 的協(xié)調(diào); 同時(shí)完成該怎么,其中一個(gè)完成該如何。allOf, anyOf
  • CompletableFuture?有太多太多的方法,并伴有?async?與 非?async?兩個(gè)版本。試想一下,如過不用?Future?或 ?CompletableFuture, 想要實(shí)現(xiàn)等待某個(gè)線程完成之后才做后續(xù)的事,可以用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, 當(dāng)前線程不被阻塞System.out.println(111);//線程任務(wù)完成的話,執(zhí)行回調(diào)函數(shù),不阻塞后續(xù)操作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;} }

    輸出結(jié)果:

    111
    222
    23.55

    ?

    getPriceAsync() 模擬一個(gè)很耗時(shí)的操作,因?yàn)槠湫袨槭窃谝粋€(gè)線程中做的,所以不會(huì)阻塞打印 111的程序;
    getPriceAsync()中線程在執(zhí)行完后才會(huì)把23.55賦值給futurePrice,所以futurePrice.whenComplete..要等待futurePrice.complete(23.55)執(zhí)行完才會(huì)執(zhí)行whenComplete。 注意whenComplete內(nèi)部也是開新的線程執(zhí)行,所以不會(huì)阻塞當(dāng)前代碼,System.out.println(222)會(huì)被執(zhí)行,最后當(dāng)futurePrice.complete(23.55)執(zhí)行完后, System.out.println(aDouble)會(huì)執(zhí)行

    轉(zhuǎn)載于:https://www.cnblogs.com/liufei1983/p/8481251.html

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。