CompletableFutures使用方法

52 阅读1分钟
ExecutorService executorService =
        new ThreadPoolExecutor
                (4,
                64,
                        60,
                        TimeUnit.SECONDS,
                        new LinkedBlockingQueue<>(1000),
                        new NamedThreadFactory("supplier-empowerment-management-head-service-impl-executorService", true),
                        new ThreadPoolExecutor.CallerRunsPolicy());
                        
                        ```
@Override
public void testCompleteFuture() {


    CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> "你好", executorService);

    try {
        String s = stringCompletableFuture.get(10, TimeUnit.SECONDS);
        System.out.println(s);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    } catch (ExecutionException e) {
        throw new RuntimeException(e);
    } catch (TimeoutException e) {
        throw new RuntimeException(e);
    }

     CompletableFuture
            .supplyAsync(() -> "hello",executorService)
            .thenApply(s -> s + " world")
            .thenAccept(System.out::println)
            .exceptionally(ex -> {
                log.error("抛出异常");
                return null;
            });


    CompletableFuture.supplyAsync(()->"你好",executorService)
            .thenApply(s-> s + "world" )
            .thenAcceptAsync(System.out::println,executorService)
            .completeExceptionally(new RuntimeException("抛出异常"));


    CompletableFuture<String> stringCompletableFuture1 = CompletableFuture.supplyAsync(() -> "我们是谁", executorService);

    CompletableFuture<String> stringCompletableFuture2 = CompletableFuture.supplyAsync(() -> "中国人", executorService);


    CompletableFuture<Void> voidCompletableFuture =
            CompletableFuture.allOf(stringCompletableFuture1, stringCompletableFuture2);


    String join = voidCompletableFuture.thenApply(v -> {
            stringCompletableFuture1.join();
            stringCompletableFuture2.join();
            return stringCompletableFuture1.join() + " " + stringCompletableFuture2.join();
        }).join();


    System.out.println(join);


    // 并行
    stringCompletableFuture1.thenCombine(stringCompletableFuture2, (s1, s2) -> s1 + " " + s2).thenAccept(System.out::println);


    // 串行,拿到上一个结果,来处理下面的任务
    stringCompletableFuture1.thenCompose(stringCompletableFuture11 -> stringCompletableFuture2).thenAccept(System.out::println);

}