使用thenCombine , 合併再個不相干的 CompletableFuture 對象 java
CompletableFuture<Long> future = CompletableFuture.supplyAsync(FutureTest::getOrderCount) .thenCombine(CompletableFuture.supplyAsync(FutureTest::getOrderCount), (arg1, arg2) -> arg1 + arg2);
以上操做是先異步獲取一個訂單個數量 ,再異步獲取另外一個訂單數量。而後再個再將兩個訂單數量再進行求和
dom
使用 thenAccept 處理異步的結果異步
Stream<CompletableFuture<Long>> futureStream = IntStream.range(0, 10) .mapToObj(i -> CompletableFuture.supplyAsync(FutureTest::getOrderCount)); CompletableFuture[] blankFuture = futureStream .map(item -> item.thenAccept(System.out::println)) .toArray(CompletableFuture[]::new);
allOf anyOf 處理多個Future線程
//在這裏等待全部的線程結束 CompletableFuture.allOf(blankFuture).join(); //若是你只須要其中一個線程有返回就行,那麼可使用 anyOf 如: Object result = CompletableFuture.anyOf(blankFuture).join();
全部代碼:code
package com.example.demo.future; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; public class FutureTest { /** * 獲取門店id * * @return */ private static Long getOrderCount() { long id = Math.round(Math.random() * 10); try { Thread.sleep(id * 1000); //擬處理遠程處理時間 } catch (InterruptedException e) { e.printStackTrace(); } return id; } public static void main(String[] args) { //使用thenCombine , 合併再個不相干的 CompletableFuture 對象 CompletableFuture<Long> future = CompletableFuture.supplyAsync(FutureTest::getOrderCount) .thenCombine(CompletableFuture.supplyAsync(FutureTest::getOrderCount), (arg1, arg2) -> arg1 + arg2); //以上操做是先異步獲取一個訂單個數量 ,再異步獲取另外一個訂單數量。而後再個再將兩個訂單數量再進行求和 //使用 thenAccept 處理異步的結果 Stream<CompletableFuture<Long>> futureStream = IntStream.range(0, 10) .mapToObj(i -> CompletableFuture.supplyAsync(FutureTest::getOrderCount)); CompletableFuture[] blankFuture = futureStream .map(item -> item.thenAccept(System.out::println)) .toArray(CompletableFuture[]::new); //在這裏等待全部的線程結束 CompletableFuture.allOf(blankFuture).join(); //若是你只須要其中一個線程有返回就行,那麼可使用 anyOf 如: Object result = CompletableFuture.anyOf(blankFuture).join(); System.out.println("end ..."); } }