一、概述
spring自带线程池有2个核心配置,一个是线程池的大小,一个是队列的大小。
ThredPoolTaskExcutor的处理流程:
新建线程并处理请求,直到线程数大小等于corePoolSize;
将请求放入workQueue中,线程池中的空闲线程去workQueue中取任务并处理;
当workQueue满时,就新建线程并处理请求,当线程池子大小大小等于maximumPoolSize时,会用RejectedExecutionHandler来做拒绝处理。
Reject策略有四种:
(1)AbortPolicy策略,是默认的策略,拒绝请求并抛出异常RejectedExecutionException。
(2)CallerRunsPolicy策略 ,由调用线程执行任务.
(3)DiscardPolicy策略,拒绝请求但不抛出异常.
(4)DiscardOldestPolicy策略,丢弃最早进入队列的任务.
二、多个异步处理共用同一个线程池的异常情况
模拟一个耗时的操作,该操作通过Async注解设置为异步执行。Async会默认使用名为taskExecutor的线程池。该操作返回一个CompletableFuture,后续的处理中会等待该异步操作执行完成。
@Service
public class DelayService {
@Async
public CompletableFuture delayFoo(String v) {
try {
Thread.sleep(1000L)