异步神器CompletableFuture

本文介绍了Java8的CompletableFuture,用于简化异步编程。通过创建CompletableFuture对象、计算结果完成时的通知、转换和消费、组合任务以及异常处理等多个方面进行讲解。举例说明了如何利用CompletableFuture提高接口响应速度,实现异步任务的高效组合。
摘要由CSDN通过智能技术生成

异步神器CompletableFuture

 

介绍

上个礼拜我们线上有个接口比较慢,这个接口在刚开始响应时间是正常的。但随着数据量的增多,响应时间变慢了。

这个接口里面顺序调用了2个服务,且2个服务之间没有数据依赖。我就用CompletableFuture把调用2个服务的过程异步化了一下,响应时间也基本上缩短为原来的一半,问题解决。

异步神器CompletableFuture

 

正好上次分享了函数式接口和Stream的使用,这次就分享一下CompletableFuture,里面也用到了大量的函数式接口

想方便的异步执行任务,就必须放到单独的线程中。继承Thread类,实现Runnable都不能拿到任务的执行结果,这时就不得不提创建线程的另一种方式了,实现Callable接口。

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

Callable接口一般配合ExecutorService来使用

// ExecutorService.java
<T> Future<T> submit(Callable<T> task);
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> result = executor.submit(() -> {
    int sum = 0;
    for (int i = 0; i < 100; i++) {
        sum += i;    }    return sum;
});// 4950
System.out.println(result.get());

我们从Future中获取结果

public interface Future<V> {
 // 取消任务的执行
    boolean cancel(boolean mayInterruptIfRunning); // 任务是否已经取消
    boolean isCancelled(); // 任务是否已经完成
    boolean isDone(); // 获取任务执行结果,会阻塞线程
    V get() throws InterruptedException, ExecutionException; // 超时获取任务执行结果,会阻塞线程
    V get(long timeout, TimeUnit unit)        throws InterruptedException, ExecutionException, TimeoutExcep
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异步调用CompletableFuture是一种非常强大的工具,它可以帮助我们处理异步编程的复杂性。下面是一个简单的示例,展示了CompletableFuture的基本用法: ```java import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CompletableFutureExample { public static void main(String[] args) { // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 异步执行任务 CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello, World!"; }, executor); // 注册回调函数 future.thenAccept(result -> System.out.println("Result: " + result)); // 关闭线程池 executor.shutdown(); } } ``` 在上面的例子中,我们首先创建了一个线程池,然后使用`CompletableFuture.supplyAsync()`方法将任务异步执行。在这个示例中,任务会休眠1秒钟,然后返回一个字符串结果"Hello, World!"。 接下来,我们通过调用`thenAccept()`方法注册了一个回调函数,该函数会在任务完成后被调用,并且会打印出结果。 最后,我们关闭了线程池。 需要注意的是,CompletableFuture还提供了很多其他的方法,可以帮助我们实现更加复杂的异步编程逻辑,比如`thenApply()`、`thenCompose()`、`thenCombine()`等等。你可以根据具体的需求选择适合的方法来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值