java CompletableFuture 异步任务执行

现代软件开发中,同时处理多个任务的能力变得越来越重要。异步编程是实现这一目标的关键技术,它允许程序在等待长时间运行的任务完成时继续执行。

CompletableFuture 是什么?

CompletableFuture是Java 8中引入的一个类,是对Future接口的增强,Future表示一个异步计算的结果,而CompletableFuture则提供了更多的操作和灵活性。CompletableFuture可以用于编写异步任务的执行流程,可以通过链式调用来组合多个异步操作,实现更复杂的异步处理逻辑。

要创建CompletableFuture,可以使用Completable未来类中的静态工厂方法。例如,要创建返回字符串的CompletableFuture,我们可以使用以下代码:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 一些需要长时间执行的代码
return "result";
});

这段代码创建了一个CompletableFuture,异步执行完成时返回字符串结果。

当CompletableFuture完成时,可以使用get方法检索其结果,但是调用get方法会阻塞当前线程,直到返回结果为止。更好的方法是使用thenAccept方法,它允许指定一个回调函数,在不阻塞线程的方式返回结果。
使用thenAccept方法打印CompletableFuture的结果:

public CompletableFuture<Integer> externalApiCall() {
        return CompletableFuture.supplyAsync(() -> {
            int val = new Random().nextInt(100);

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return val;
        });
}

externalApiCall()
.thenAccept(val -> System.out.println("Returned result: " + val));

还可以将多个CompletableFutures连接在一起,以执行一系列的异步任务。
当一个CompletableFuture完成时,可以使用它的结果来启动下一个ComplextableFuture。
使用thenCompe或thenCombine方法来链接CompletableFutures

public CompletableFuture<Integer> externalApiCall() {
        return CompletableFuture.supplyAsync(() -> {
            int val = new Random().nextInt(100);

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return val;
        });
}

externalApiCall()
// 使用thenCompose将Integer转换为String
.thenCompose(val -> CompletableFuture.completedFuture(String.valueOf(val)))
.thenAccept(val -> System.out.println("Returned Value: " + val));

externalApiCall()
.thenCombine(externalApiCall(), Integer::sum)
.thenAccept(val -> System.out.println("Returned Value: " + val));

CompletableFuture还提供了几种方法来处理异步任务执行过程中可能发生的异常,可以使用exception方法来指定在发生异常时的回调函数。还可以使用handle方法指定一个回调函数,无论CompletableFuture是否正常完成,都会调用该函数。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    // 一些长时间运行的计算可能引发异常
    throw new RuntimeException("exception");
});

future.exceptionally(ex -> {
    System.out.println("Exception: " + ex.getMessage());
    return 0;
});

future.thenAccept(result -> System.out.println("Result: " + result);

更多使用说明:

https://www.apiref.com/java11-zh/java.base/java/util/concurrent/CompletableFuture.html

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇