Lagom学习 四 CompletionStage
Future:?Java 8 之前的 Java 版本功能較弱,僅支持兩種用法:要么檢查 future 是否已經(jīng)完成,要么等待 future 完成;
Java 8 增加了?CompletableFuture<T>?類,它實(shí)現(xiàn)了新的?CompletionStage<T>?接口,并對?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, 從此線程與線程之間可以愉快的對話了。最初兩個(gè)線程間的協(xié)調(diào)我采用過 Object 的 ?wait()?和?notify()?, Thread 的?join()?方法,那可算是很低級的 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)什么,具體大致有:
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)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Arithmetic图像处理halcon
- 下一篇: java 8 64_java8离线安装包
