Java 之 异步 CompletableFuture

本文详细介绍了Java 8中的CompletableFuture类,用于简化异步编程。从创建异步对象到处理回调,包括handle方法、线程串行化方法如thenApply、thenAccept和thenRun,以及多种任务组合方式,如两任务同时完成、一个任务完成后的处理,最后讨论了多任务组合的allof和anyof方法。
摘要由CSDN通过智能技术生成

        在 Java8 中,有 CompletableFuture 类,帮助简化了异步编程的复杂性。

一、创建异步对象

        Completable 提供了四个静态方法创建异步操作。

import java.util.concurrent.*;

public class CompletableFutureTest {
    // 创建一个线程池
    public static ExecutorService executor =Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 无返回结果 , 且使用默认线程池 
        // result: ForkJoinPool.commonPool-worker-1 === > runAsync(runnable)
        CompletableFuture.runAsync(
                ()-> System.out.println(Thread.currentThread().getName()+" === > runAsync(runnable)"));
        
        // 无返回结果 , 且使用自定义线程池 
        // result: pool-1-thread-1 === > runAsync(runnable,executor)
        CompletableFuture.runAsync(
                ()-> System.out.println(Thread.currentThread().getName()+" === > runAsync(runnable,executor)"), executor);


        // 有返回结果 , 且使用默认线程池 
        // result: main get result : ForkJoinPool.commonPool-worker-1 === > supplyAsync(supplier)
        CompletableFuture<String> supply1 = CompletableFuture.supplyAsync(
                () -> Thread.currentThread().getName() + " === > supplyAsync(supplier)");
        System.out.println(Thread.currentThread().getName()+" get result : "+supply1.get());


        // 有返回结果 , 且使用自定义线程池 
        // result: main get result : pool-1-thread-2 === > supplyAsync(supplier,executor)
        CompletableFuture<String> supply2 = CompletableFuture.supplyAsync(
                () -> Thread.currentThread().getName() + " === > supplyAsync(supplier,executor)",executor);
        System.out.println(Thread.currentThread().getName()+" get result : "+supply2.get());
    }
}

 二、 异步对象完成后的回调

        在上述异步对象完成后,可以回调对应方法

        方法中有后缀 Async 的表示异步执行(利用新的线程去处理),否则继续利用同一个线程处理。

        方法中有带 Executor 参数 的,表示可以传入自定义的线程池,利用其中的线程进行处理。

         whenComplete* 方法可以获取到上一个 Future 的 结果 或 异常 

        (1) whenCo

  • 3
    点赞
  • 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、付费专栏及课程。

余额充值