Java异步编程----基于CompletableFuture实现异步计算与结果转换

本文深入介绍了Java中的CompletableFuture,包括无返回值和有返回值的方法、结果设置、组合运算以及与Stream流的结合使用。通过实例展示了如何在多线程环境中同步异步任务,如thenRun、thenAccept、thenApply等方法的运用,以及如何通过thenCompose和thenCombine进行任务组合。此外,还提到了线程池默认配置和get方法的阻塞特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当多个线程企图调用同一个CompletableFuture的complete、cancel方法时,只有一个会成功

使用默认的线程池执行异步任务,如果没有显式指定线程个数,默认线程个数等于当前机器上可用的CPU个数

1.无返回值的方法

public static Void hasNoReturn() throws ExecutionException, InterruptedException {
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> doAnything();
    return future.get();
}


输出  null
runAsync() 方法没有返回值   因此使用 future.get() 永远返回null

2.有返回值的方法

public static String hasReturn() throws ExecutionException, InterruptedException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "1");
        return future.get();
}


输出 1   
supplyAsync() 方法有返回值  可通过计算得到返回结果

3.使用一个异步任务的结果作为另一个异步任务的参数

1.无返回值

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "1");
CompletableFuture<Void> future2 =future.thenRun(() -> System.out.println("ok"));

thenRun()  方法
2.无返回值但可以拿到上个任务的结果

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "1");
CompletableFuture<Void> future2 =future.thenAccept(s -> s = s+"2");

thenAccept() 方法
3.有返回值

public static String hasReturn() throws ExecutionException, InterruptedException {
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "1");
    CompletableFuture<String> future2 =future.thenApply(s -> {
        s = s + "2";
        return s;
    });
    return future2.get();
}

输出为 12   参数中的 s 为future任务执行完毕的结果
future2的结果是基于future的结果得到的,
如果执行get()方法时future/future2没有计算完成, 则会阻塞	

4.强制设置结果

public static String hasReturn() throws ExecutionException, InterruptedException {
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "1");
    future.complete("2");
    return future.get();
}

输出 2 

5.多个CompletableFuture组合运算

1. 当一个CompletableFuture执行完执行另一个CompletableFuture

public static CompletableFuture<String> doSomething1(String id) {
    return CompletableFuture.supplyAsync(() -> id);
}

public static CompletableFuture<String> doSomething2(String id) {
    return CompletableFuture.supplyAsync(() -> id + "1");
}

public static String getResult() throws ExecutionException, InterruptedException {
    CompletableFuture<String> result = doSomething1("123").thenCompose(Feature::doSomething2);
        return result.get();
}

执行完doSomething1后执行doSomething2   结果为1231
2. 实现两个并发的CompletableFuture完成后,将结果作为参数计算

public static String getResult() throws ExecutionException, InterruptedException {
    CompletableFuture<String> result = doSomething1("123").thenCombine(doSomething2("456"),
         (one, two) -> one + two);
    return result.get();

输出  1234561

6.Stream流与异步结合

public static List<String> getResult() {
    List<CompletableFuture<String>> completableFutures;
    List<String> list = Arrays.asList("li", "lin");
    
    --循环传入参数--
    completableFutures = list.stream().map(Feature::doSomething2).collect(Collectors.toList());
    
	--获取每个异步任务的结果并存放于列表中	
	return completableFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
}

输出为  [li1, lin1]

CompletableFuture 基础用法介绍完毕
摘自 <<Java异步编程实战>>

点个赞再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值