java 8 CompletableFuture (3)

使用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 ...");

    }
}
相關文章
相關標籤/搜索