写点什么

SpringBoot 整合线程池

  • 2024-08-26
    福建
  • 本文字数:1380 字

    阅读完需:约 5 分钟

分为三步


  1. 启动类加 @EnableAsync 注解

  2. 在方法上加 @Async 注解

  3. 创建线程池配置类


1.启动类加 @EnableAsync 注解


@SpringBootApplication@EnableAsyncpublic class FacadeH5Application {    public static void main(String[] args) {        SpringApplication.run(FacadeH5Application.class, args);    }}
复制代码


2.在方法上加 @Async 注解


@Asyncpublic void m1() {    //do something}
复制代码


注意:导致 @Async 注解失效的几个原因


  1. 两个方法都在同一个类里面,一个方法调用另一个异步方法,不生效。但是如果在本类中注入自己的实例,再通过自己的实例调用异步方法就可行。

  2. @Async 方法所在的类没有交给 spring 代理(没加诸如 @Component 注解),不生效。

  3. 注解的方法不是是 public 方法,不生效。


3.创建线程池配置类


默认的线程池配置如下

# 核心线程数spring.task.execution.pool.core-size=8  # 最大线程数spring.task.execution.pool.max-size=16# 空闲线程存活时间spring.task.execution.pool.keep-alive=60s# 是否允许核心线程超时spring.task.execution.pool.allow-core-thread-timeout=true# 线程队列数量spring.task.execution.pool.queue-capacity=100# 线程关闭等待spring.task.execution.shutdown.await-termination=falsespring.task.execution.shutdown.await-termination-period=# 线程名称前缀spring.task.execution.thread-name-prefix=task-
复制代码


创建线程池配置类


@Configurationpublic class ThreadPoolConfig {    @Bean    public TaskExecutor taskExecutor(){        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        //设置核心线程数        executor.setCorePoolSize(10);        //设置最大线程数        executor.setMaxPoolSize(20);        //设置队列容量        executor.setQueueCapacity(20);        //设置线程活跃时间        executor.setKeepAliveSeconds(30);        //设置线程名称前缀        executor.setThreadNamePrefix("sendSms-");        //设置拒绝策略        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        //等待所有任务结束后再关闭线程池        executor.setWaitForTasksToCompleteOnShutdown(true);        //设置线程池中任务的等待时间        executor.setAwaitTerminationSeconds(60);
return executor; }}
复制代码


配置多个线程池


有时候,一个项目中如果配置了多个线程池,那需要在 @Bean 后面加上线程池的名称


@Configurationpublic class ThreadPoolConfig {    @Bean("ThreadPool1")    public TaskExecutor taskExecutor(){        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();		......        return executor;    }    @Bean("ThreadPool2")    public TaskExecutor taskExecutor(){        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();		......        return executor;    }}
复制代码


在使用 @Async 注解时就需要指明具体使用的线程池,如下格式

@Async("ThreadPool1")public void m1() {    //do something}
复制代码


文章转载自:救苦救难韩天尊

原文链接:https://www.cnblogs.com/GilbertDu/p/18358419

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot 整合线程池_Java_快乐非自愿限量之名_InfoQ写作社区