Java异步线程中的CompletableFuture与@Async详解

 更新时间:2024年01月19日 09:12:44   作者:景庆197  
这篇文章主要介绍了Java异步线程中的CompletableFuture与@Async详解,CompletableFuture是java中提供的一个异步执行类,@Async是Spring提供的异步执行方法,当调用方法单独开启一个线程进行调用,需要的朋友可以参考下

引言

1.CompletableFuture是java中提供的一个异步执行类,@Async是Spring提供的异步执行方法,当调用方法单独开启一个线程进行调用。

2.@Async通常指定一个方法使用的异步方法调用,而CompletableFuture可以一个方法体内对请求体进行排序组合成链式调用再返回

1.@Async的使用

@Async的粒度比较大,在使用的时候只能添加到方法上,并且需要自定义线程池。

实现:

需要在配置类上添加@Configuration

需要实现AsyncConfigure接口,里面有两个方法可以重写[getAsyncExecutor,getAsyncUncaughtExceptionHandler],主要实现的方法是getAsyncExecutor(),

我们当时实现手动注入一个@Bean。

ps:ThreadPoolTaskExecutor设计模式是:模板方法和策略模式

代码实现:

@Configuration
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        /**
         * ThreadPoolExecutor通用线程池
         * ThreadPoolTaskExecutor 是再ThradPoolExecutor上面做增强,支持业务执行任务、支持定时任务、spring的线程管理等
         */
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(100);
        threadPoolTaskExecutor.setQueueCapacity(10);
        // 设置线程池全部结束的时候才完全关闭线程
        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        // 当线程关闭的时候需要等待多长时间才进行关闭
        threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
        // 设置线程的名字
        threadPoolTaskExecutor.setThreadNamePrefix("Rabbit-Async-");
        // 进行初始化
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
// 需要实现AsynConfiguration的两个方法
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

2.CompletableFuture总体架构

Future 它是java5添加的接口,用来描述一个异步计算的结果,可以用isDone方法来计算是否完成,或者使用get阻塞往效用线程,直到计算返回结果,可以使用Cancel方法停止任务执行。

CompletableFuture实现Furure接口,不推荐使用get方式阻塞或者轮询方式获取结果。

CompletableFuture.supplyAsync(Runnable,Executor);//支持返回值

CompletableFutre.runAsync(Runnable,Executor);//不支持返回值

3.计算完成时回调方法

whenComplete(BigConsumer):同步完成正常处理结果

whenCompleteAsync(BigConsumer):异步完成处理结果

whenCompleteAysnc(BigConsumer,Executor):异步完成处理结果

exceptionally(Function):处理异常结果

串行化与并行化

串行化:程序从上到下执行的都是一个循序

并行化:从上到下执行顺序不一定

串行化案例

thenApply方法(有返回值):当一个线程依赖另一个线程是,获取上一个任务返回结果,并返回当前任务的返回值

thenAccept方法(无返回值):接受任务的处理结果,并消费处理,无返回值结果。

thenRun方法(最后执行):只有上面的任务执行完成,就开始执行thenRun,只是处理完任务后执行thenRun的后续操作。

 并行化案例:

多任务组合

allof().join();:等待所有任务完成之后返回

anyof():只有一个任务完成

到此这篇关于Java异步线程中的CompletableFuture与@Async详解的文章就介绍到这了,更多相关CompletableFuture与@Async内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java方法的参数传递机制详解

    Java方法的参数传递机制详解

    这篇文章主要介绍了Java方法的参数传递机制详解,对于Java初学者来说,刚学习Java的时候可能经常会听到调用方法时参数的值传递与引用传递,但是,实际上Java中方法的参数传递机制只有值传递,需要的朋友可以参考下
    2024-01-01
  • 使用Java制作一个简单的记事本

    使用Java制作一个简单的记事本

    本文给大家带来的是使用Java制作一个简单的记事本的代码,有相同需要的朋友可以参考下
    2015-02-02
  • Java的Comparable,Comparator和Cloneable三大接口详解

    Java的Comparable,Comparator和Cloneable三大接口详解

    这篇文章主要为大家详细介绍了Java的Comparable,Comparator和Cloneable的接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • java抽象类和接口定义与用法详解

    java抽象类和接口定义与用法详解

    这篇文章主要介绍了java抽象类和接口定义与用法,结合实例形式详细分析了java抽象类和接口的基本概念、原理、定义、使用方法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • 通过简单方法实现spring boot web项目

    通过简单方法实现spring boot web项目

    这篇文章主要介绍了通过简单方法实现spring boot web项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java调用第三方http接口的四种方式总结

    Java调用第三方http接口的四种方式总结

    这篇文章主要给大家介绍了关于Java调用第三方http接口的四种方式,在实际开发中我们经常会与第三方公司进行合作,接入第三方接口,文中给出了详细的代码实例,需要的朋友可以参考下
    2023-08-08
  • Spring注解之@PropertySource详解

    Spring注解之@PropertySource详解

    这篇文章主要介绍了Spring注解之@PropertySource详解,@PropertySource注解用于指定资源文件读取的位置,它不仅能读取properties文件,也能读取xml文件,并且通过YAML解析器,配合自定义PropertySourceFactory实现解析YAML文件,需要的朋友可以参考下
    2023-11-11
  • Java代码性能优化的35个方法总结

    Java代码性能优化的35个方法总结

    本篇文章主要介绍了Java代码性能优化的35个方法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java有序的Map LinkedHashMap用法详解

    Java有序的Map LinkedHashMap用法详解

    LinkedHashMap是Java提供的一个集合类,它继承自HashMap,并在HashMap基础上维护一条双向链表,本文给大家介绍java 有序的Map LinkedHashMap简介,感兴趣的朋友一起看看吧
    2024-01-01
  • java如何使用正则表达式限制特殊字符的个数

    java如何使用正则表达式限制特殊字符的个数

    这篇文章主要介绍了java如何使用正则表达式限制特殊字符的个数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论