1. 程式人生 > 其它 >JDK1.8新特性CompletableFuture的總結

JDK1.8新特性CompletableFuture的總結

CompletableFuture

JDK 5引入了Future模式。Future介面是Java多執行緒Future模式的實現,在java.util.concurrent包中,可以來進行非同步計算。

Future模式是多執行緒設計常用的一種設計模式。Future模式可以理解成:我有一個任務,提交給了Future,Future替我完成這個任務。期間我自己可以去做任何想做的事情。一段時間之後,我就便可以從Future那兒取出結果。

缺點:

  • Future雖然可以實現獲取非同步執行結果的需求,但是它沒有提供通知的機制,我們無法得知Future什麼時候完成。
  • 要麼使用阻塞,在future.get()的地方等待future返回的結果,這時又變成同步操作。要麼使用isDone()輪詢地判斷Future是否完成,這樣會耗費CPU的資源。

CompletableFuture

  • 能夠將回調放到與任務不同的執行緒中執行,也能將回調作為繼續執行的同步函式,在與任務相同的執行緒中執行。它避免了傳統回撥最大的問題,那就是能夠將控制流分離到不同的事件處理器中。
  • 彌補了Future模式的缺點。在非同步的任務完成後,需要用其結果繼續操作時,無需等待。可以直接通過thenAccept、thenApply、thenCompose等方式將前面非同步處理的結果交給另外一個非同步事件處理執行緒來處理。
  • 可以使用指定的執行緒池處理任務,如果不指定使用預設執行緒池:ForkJoinPool執行緒池

CompletableFuture

JDK 5引入了Future模式。Future介面是Java多執行緒Future模式的實現,在java.util.concurrent包中,可以來進行非同步計算。

Future模式是多執行緒設計常用的一種設計模式。Future模式可以理解成:我有一個任務,提交給了Future,Future替我完成這個任務。期間我自己可以去做任何想做的事情。一段時間之後,我就便可以從Future那兒取出結果。

缺點:

  • Future雖然可以實現獲取非同步執行結果的需求,但是它沒有提供通知的機制,我們無法得知Future什麼時候完成。
  • 要麼使用阻塞,在future.get()的地方等待future返回的結果,這時又變成同步操作。要麼使用isDone()輪詢地判斷Future是否完成,這樣會耗費CPU的資源。

CompletableFuture

  • 能夠將回調放到與任務不同的執行緒中執行,也能將回調作為繼續執行的同步函式,在與任務相同的執行緒中執行。它避免了傳統回撥最大的問題,那就是能夠將控制流分離到不同的事件處理器中。
  • 彌補了Future模式的缺點。在非同步的任務完成後,需要用其結果繼續操作時,無需等待。可以直接通過thenAccept、thenApply、thenCompose等方式將前面非同步處理的結果交給另外一個非同步事件處理執行緒來處理。
  • 可以使用指定的執行緒池處理任務,如果不指定使用預設執行緒池:ForkJoinPool執行緒池
  • xxx():表示該方法將繼續在已有的執行緒中執行;
  • xxxAsync():表示將非同步線上程池中執行。
  • thenAccept()處理正常結果;
  • exceptional()處理異常結果;
  • thenApplyAsync()用於序列化另一個CompletableFuture;
  • anyOf()和allOf()用於並行化多個CompletableFuture。

優點:

  • 非同步任務結束時,會自動回撥某個物件的方法;
  • 非同步任務出錯時,會自動回撥某個物件的方法;
  • 主執行緒設定好回撥後,不再關心非同步任務的執行。

1、上一個非同步操作結果影響下一個非同步操作結果:ThenApplySync()

 CompletableFuture<String> cfTask=CompletableFuture.supplyAsync(()->{}
 CompletableFuture<Integer> cfTask2=cfTask.thenApplyAsync((code)->{}
 cfTask2.thenAccept((price)->{}

2、前邊任意一個非同步有結果返回,直接進行下一步:anyOf()

CompletableFuture<String> cfTaskFrom1=CompletableFuture.supplyAsync(()->{}
CompletableFuture<String> cfTaskFrom2=CompletableFuture.supplyAsync(()->{}
CompletableFuture<Object cfTaskFrom=CompletableFuture.anyOf(cfTaskFrom1,cfTaskFrom2);
CompletableFuture<Integer> cfTaskResult=cfTaskFrom.thenApply((code)->{});
cfTaskResult.thenAccept((price)->{});

3、和anyOf()相反,allOf()需要所有任務全部完成才能繼續下一步。

—Completable