Java多线程工具CompletableFuture

本文介绍了Java中的CompletableFuture,它是为了解决Future的不足,提供了非阻塞和链式调用的能力。文章详细阐述了CompletableFuture的使用方式,包括基本使用、异常处理策略、案例分析以及常见问题解答,帮助读者理解如何高效地利用CompletableFuture进行多线程编程。
摘要由CSDN通过智能技术生成

前言

Future的问题

写多线程程序的时候,可以使用Future从一个异步线程中拿到结果,但是如果使用过程中会发现一些问题:

  • 如果想要对Future的结果做进一步的操作,需要阻塞当前线程

  • 多个Future不能被链式的执行,每个Future的结果都是独立的,期望对一个Future的结果做另外一件异步的事情;

  • 没有异常处理策略,如果Future执行失败了,需要手动捕捉

CompletableFuture应运而生

为了解决Future问题,JDK在1.8的时候给我们提供了一个好用的工具类CompletableFuture;

它实现了Future和CompletionStage接口,针对Future的不足之处给出了相应的处理方式。

  • 在异步线程执行结束后可以自动回调我们新的处理逻辑,无需阻塞
  • 可以对多个异步任务进行编排,组合或者排序
  • 异常处理

CompletableFuture的核心思想是将每个异步任务都可以看做一个步骤(CompletionStage),然后其他的异步任务可以根据这个步骤做一些想做的事情。

CompletionStage定义了许多步骤处理的方法,功能非常强大,这里就只列一下日常中常用到的一些方法供大家参考。

使用方式

基本使用-提交异步任务

简单的使用方式

异步执行,无需结果:

// 可以执行Executors异步执行,如果不指定,默认使用ForkJoinPool
CompletableFuture.runAsync(() -> System.out.println("Hello CompletableFuture!"));
复制代码

异步执行,同时返回结果:

// 同样可以指定线程池
CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> "Hello CompletableFuture!");
System.out.println(stringCompletableFuture.get());
复制代码

处理上个异步任务结果

  • thenRun: 不需要上一步的结果,直接直接新的操作

  • thenAccept:获取上一步异步处理的内容,进行新的操作

  • thenApply: 获取上一步的内容,然后产生新的内容

所有加上Async后缀的,代表新的处理操作仍然是异步的。Async的操作都可以指定Executors进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值