您现在的位置是:主页 > Web前端技术 > Web前端技术

SpringBoot多线程@Async怎么用开发技术

IDCBT2021-12-29服务器技术人已围观

简介这篇文章主要介绍了SpringBoot多线程@Async怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 多线程@A

这篇文章主要介绍了SpringBoot多线程@Async怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

        多线程@Async的使用体验场景

        导入:可以将大批量的数据insert操作采用多线程的方式并行执行

        第三方服务的接口调用:由于存在个别第三方服务调用比较耗时的场景,此时就可以与自身服务的逻辑并行执行

        简而言之:接口中部份业务逻辑可以通过并行的方式来优化接口性能

        1.线程池配置
        @Configuration
        @EnableAsync
        public class TaskPoolConfig {
        
            @Bean("taskExecutor") // bean 的名称,默认为首字母小写的方法名
            public Executor taskExecutor() {
                ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
                //核心线程数(CPU核心数+1)
                executor.setCorePoolSize(10);
                //最大线程数(2*CPU核心数+1)
                executor.setMaxPoolSize(20);
                //缓冲队列数
                executor.setQueueCapacity(200);
                //允许线程空闲时间(单位:默认为秒)
                executor.setKeepAliveSeconds(60);
                //线程池名前缀
                executor.setThreadNamePrefix("sub-thread-");
                // 增加 TaskDecorator 属性的配置
                executor.setTaskDecorator(new ContextDecorator());
                // 线程池对拒绝任务的处理策略:CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
                executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                executor.initialize();
                return executor;
            }
        }
        2.子父线程之间共享一个Request的配置方案

        1.实现TaskDecorator接口

        /**
         * 子线程装饰器
         *
         * @author Da Shuai
         * @date 2021-06-10 18:28:17
         */
        public class SubThreadTaskDecorator implements TaskDecorator {
        
            @Override
            public Runnable decorate(Runnable runnable) {
                RequestAttributes context = RequestContextHolder.currentRequestAttributes();
                return () -> {
                    try {
                        RequestContextHolder.setRequestAttributes(context);
                        runnable.run();
                    } finally {
                        RequestContextHolder.resetRequestAttributes();
                    }
                };
            }
        }

        标签:

        很赞哦! ()

本栏推荐