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 完成后該干點什么,具體大致有:
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arithmetic图像处理halcon
- 下一篇: java 8 64_java8离线安装包