欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot 线程池

程序员文章站 2022-05-01 13:00:47
...

spring boot: 线程池

使用spring boot 线程池需要在主方法或者controller类上加上@EnableAsync注解,开启异步执行

ThreadPoolTaskExecutor, 多线程

@Async

  1. @Async 注解会将任务提交到ThreadPoolTaskExecutor线程池中执行
  2. value 指定使用哪个线程池

config文件中配置

executor.setCorePoolSize(16); //配置核心线程数
executor.setMaxPoolSize(64);  //配置最大线程数
executor.setQueueCapacity(9999); //配置队列大小
executor.setThreadNamePrefix("async-order-");
//配置线程池中的线程的名称前缀 (指定一下线程名的前缀)
        // rejection-policy:当pool已经达到max pool size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是由调用线程(提交任务的线程)处理该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//拒绝策略:
/*1.DiscardOldestPolicy    超出线程池直接丢弃比较老的线程
  2.AbortPolicy        超出大小抛出异常
  3.CallerRunsPolicy      直接在当前线程中运行此任务,不拒绝
  4.DiscardPolicy   超多线程池大小直接丢弃
他们都实现了RejectedExecutionHandler接口
拒绝策略通常是自定义实现的
*/
executor.initialize();//执行初始化

application属性配合文件中配置

修改线程池默认参数

spring.task.execution.pool.max-size=99999
#配置最大线程数
spring.task.execution.thread-name-prefix=pay-task-
#线程池前缀名称
spring.task.execution.pool.queue-capacity=99999
#配置队列大小

不用 @Async注解,我们手动利用线程池编程异步处理

 @Autowired
private ThreadPoolTaskExecutor applicationTaskExecutor;
//将applicationTaskExecutor自动注入到spring容器中
 for (int i = 0; i < 1000; i++) {
            //并发处理
            Future<String> future = applicationTaskExecutor.submit(() -> {
                String result = SMS.sendSMS("线程池执行");
                return result;
            });
            futures.add(future);
        }