springboot 线程池

1. springboot 线程池介绍

Spring Boot项目中,可以用Springboot提供的对ThreadPoolExecutor封装的ThreadPoolTaskExecutor,springboot对其进行了简化处理,在配置类或直接在程序入口类上声明注解@EnableAsync。然后在由Spring管理的对象的方法上标注注解@Async,显式调用即可生效。

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

以下情况线程池会拒绝任务:

(1).当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务

(2).当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务,线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常

ThreadPoolExecutor类有几个内部实现类来处理这类情况:

1.AbortPolicy 丢弃任务,抛运行时异常

2.CallerRunsPolicy 执行任务

3.DiscardPolicy 忽视,什么都不会发生

4.DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务实现RejectedExecutionHandler接口,可自定义处理器

配置类代码-1

配置类代码-2
配置类代码-3(单例线程池配置)


AsyncTaskBo代码
单元测试代码

注意事项,如下方式会使@Async失效

1.异步方法使用static修饰

2.异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类

3.异步方法不能与被调用的异步方法在同一个类中

4.类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象

5.如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解

你可能感兴趣的:(springboot 线程池)