package com.tsp.bss.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author hankongbin
* @since 2021/11/23 00:20
*/
@Configuration
public class AsyncConfig {
/** 核心线程池大小 */
private static final int MAX_POOL_SIZE = 4;
/** 最大可创建的线程数 */
private static final int CORE_POOL_SIZE = 4;
/** 队列最大长度 */
private static final int QUEUE_CAPACITY= 50;
@Bean("asyncTaskExecutor")
public AsyncTaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
asyncTaskExecutor.setThreadNamePrefix("async-task-thread-pool-");
asyncTaskExecutor.setQueueCapacity(QUEUE_CAPACITY);
// 线程池对拒绝任务(无线程可用)的处理策略,交由主线程处理
asyncTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
asyncTaskExecutor.initialize();
return asyncTaskExecutor;
}
}
public class TestApplication{
@Resource
private AsyncTaskExecutorasyncTaskExecutor;
@org.junit.Test
public void test(){
syncTaskExecutor.submit(()一System.out.printin(Thread.currentThread().getName())
}
}
当线程数小于corePoolSize最大线程数时,会创建一个新的线程并执行任务,执行完任务之后,不会立即销毁,阻塞在队列等待执行其他任务。当大于线程数时,不会在创建线程。当等待线程队列放不下的时候,会创建临时线程,并且会通过存活时长来销毁临时线程。