您的位置:

完美掌握CompletableFuture.whenComplete()

一、CompletableFuture是什么?

CompletableFuture是Java8新增的一个多线程编程类,它可以对异步操作进行编排,提供了一种优雅的方式处理一组Future。

Future是Java5提供的一个接口,通常用来表示一个异步计算的结果,当异步计算结束时,我们可以通过Future获取结果并继续执行其他操作。

然而,Future的问题在于它是一个单向的数据流,只能提供结果而无法传递参数。而CompletableFuture则可以通过回调、组合等方式进行操作。

二、CompletableFuture.whenComplete()是什么?

CompletableFuture.whenComplete()方法可以在Future完成后按照完成的结果执行一些操作,这些操作包括处理结果值、异常情况等。

whenComplete()方法接收一个BiConsumer 参数,其中T表示Future的返回值类型,Throwable表示异常类型。当Future执行完成后,BiConsumer会被回调并传递两个参数,分别是执行成功的结果或者执行时抛出的异常。

CompletableFuture
    completableFuture = new CompletableFuture<>();
completableFuture.complete(10);

completableFuture.whenComplete((i, e) -> {
    if (e == null) {
        System.out.println(i);
    } else {
        System.out.println(e.getMessage());
    }
});
   

代码中,首先创建了一个CompletableFuture对象,然后通过complete()方法设置了返回值为10。随后,使用whenComplete()方法对该对象进行后续处理。当Future执行完成后,如果没有发生错误,则会调用第一个Lambda表达式进行处理,否则会调用第二个Lambda表达式进行处理。

三、为什么要使用CompletableFuture.whenComplete()?

使用whenComplete()方法可以在Future执行完成后立即对其结果进行处理。在异步计算完成后,可以直接对其结果进行操作,而无需等待其他操作的完成。

同时,在whenComplete()方法中,还可以处理Future执行过程中抛出的异常。在处理异步计算的过程中,异常处理也同样重要,通过whenComplete()方法提供的异常处理能够更好地保障程序的稳定性。

四、whenComplete()方法的相关操作

1. 处理正常结果

当异步计算正常执行完成时,可以通过第一个Lambda表达式对其结果进行处理。

CompletableFuture
    completableFuture = CompletableFuture.supplyAsync(() -> "hello");
completableFuture.whenComplete((s, throwable) -> {
    System.out.println(s);
});
   

代码中,创建一个CompletableFuture对象,使用supplyAsync()方法开启一个异步任务。当任务执行完成后,通过whenComplete()方法处理其结果,将结果输出到控制台。

2. 处理异常结果

在异步计算执行过程中,有可能会出现异常情况。可以在whenComplete()方法中通过判断Throwable参数是否为空来判断异步计算是否出现了异常。

CompletableFuture
    completableFuture = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("error");
});
completableFuture.whenComplete((s, throwable) -> {
    if (throwable == null) {
        System.out.println(s);
    } else {
        System.out.println(throwable.getMessage());
    }
});
   

代码中,使用supplyAsync()方法开启一个异步任务,但是任务会抛出一个RuntimeException异常。当任务执行完成后,通过whenComplete()方法处理其异常结果,并将异常信息输出到控制台。

3. 返回处理结果

使用whenComplete()方法可以对Future的执行结果进行处理,但是当需要返回处理结果时,可以使用thenApply()、thenApplyAsync()、thenCompose()等方法。

CompletableFuture
    completableFuture = CompletableFuture.supplyAsync(() -> "hello");
CompletableFuture
     future = completableFuture.whenComplete((s, throwable) -> {
    System.out.println(s);
}).thenApply(s -> s + "world");
System.out.println(future.join());
    
   

代码中,创建一个CompletableFuture对象,使用supplyAsync()方法开启一个异步任务。当任务执行完成后,使用whenComplete()方法对其结果进行处理,并将结果拼接成一个新的字符串。最后通过join()方法获取到处理结果并输出到控制台。

4. 处理异常情况

使用whenComplete()方法可以处理异步计算执行过程中出现的异常情况,在处理异常情况时,可以使用handle()方法进行替换,使得代码更为简洁。

CompletableFuture
    completableFuture = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException();
});
completableFuture.handle((s, throwable) -> {
    return s == null ? "error" : s;
}).thenAccept(System.out::println);
   

代码中,创建一个CompletableFuture对象,任务会抛出一个RuntimeException异常。在处理完成后,使用handle()方法对异常情况进行处理,并将处理结果输出到控制台。使用handle()方法后,可以直接对异常情况进行处理而不需要再进行判断。

五、总结

CompletableFuture.whenComplete()方法是Java8中提供的一个多线程编程类,通过这个方法可以在异步计算执行完成后对其结果进行处理,同时还可以处理异常情况。适当地使用whenComplete()方法可以更好地优化程序的运行效率和稳定性,与此同时也可以使代码更加优雅简洁。