Spring多线程处理

@Async 放在方法前,方法可以异步执行

@EnableAsync可以开启异步执行

配置类中,配置@Bean 返回Executor或ThreadPoolTaskScheduler,可以实现自定义的线程池,并实现对线程池的配置

@Configuration
@EnableAsync
public class config
{
    
    @Bean
    public Executor getExecutor()
    {
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
          executor.setCorePoolSize(5);  
          executor.setMaxPoolSize(10);  
          executor.setQueueCapacity(25);  
          executor.initialize();  
          return executor;  
    }
    
    @Bean
    public ThreadPoolTaskScheduler taskScheduler()
    {
        log.info("Setting up thread pool task scheduler with 20 threads.");
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(20);
        scheduler.setThreadNamePrefix("task-");
        scheduler.setAwaitTerminationSeconds(60);
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        //异常处理方法
        //当用@Async注解的方法抛出异常的时候,可以使用该方法去处理异常
        scheduler.setErrorHandler(t -> schedulingLogger.error(
                "Unknown error occurred while executing task.", t
        ));
        //当线程池关闭的时候,如果再向线程池添加任务会抛出RejectedExecutionHandler异常
        //抛出的异常将会被该异常处理器接受
        scheduler.setRejectedExecutionHandler(
                (r, e) -> schedulingLogger.error(
                        "Execution of task {} was rejected for unknown reasons.", r
                )
        );
        return scheduler;
    }
}

以上两个Bean都可以实现对线程池的自定义。

也可以实现AsyncConffigurer接口实现对线程池更精细的粒度控制

@Component
public class MyAsyncConfigurer implements AsyncConfigurer{
     
     @Override
     public Executor getAsyncExecutor() {
            ......
     }
     
     //实现对运行中线程抛出的异常更精细的处理
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new AsyncUncaughtExceptionHandler() {
            @Override
            public void handleUncaughtException(Throwable ex, Method method, Object... params) {
                
            }
        }
    } 

    //自定义任务执行器:在定义了多个任务执行器的情况下,可以使用@Async("getMineAsync")来设定
    @Bean
    public Executor getMineAsync() {
    
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,148评论 6 342
  • 面对老板提出的需求,不妨先以产品的视角进行拆解: 1.老板提出的需求是什么?如果这个需求可行,有哪些因素可以支撑?...
    Jo_608a阅读 2,622评论 0 0
  • 今天星期五下午第二节我们上魔方,小宝宝把我的魔方给摔坏了。爸爸说在给我′买一个新的魔方,我说好呀!好呀!到了星期五...
    平凡一生123阅读 1,247评论 0 0
  • 最近参加了可以练习训练营,让我逐渐意识到,我们设定好目标后应该分解到小目标分步实施,每天向前做一点,这样既能保持一...
    Explorer84阅读 1,355评论 0 0

友情链接更多精彩内容