package com.oying.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** * 创建自定义的线程池 * @author Z * @description * @date 2023-06-08 **/ @EnableAsync @Configuration public class AsyncExecutor implements AsyncConfigurer { public static int corePoolSize; public static int maxPoolSize; public static int keepAliveSeconds; public static int queueCapacity; @Value("${task.pool.core-pool-size}") public void setCorePoolSize(int corePoolSize) { AsyncExecutor.corePoolSize = corePoolSize; } @Value("${task.pool.max-pool-size}") public void setMaxPoolSize(int maxPoolSize) { AsyncExecutor.maxPoolSize = maxPoolSize; } @Value("${task.pool.keep-alive-seconds}") public void setKeepAliveSeconds(int keepAliveSeconds) { AsyncExecutor.keepAliveSeconds = keepAliveSeconds; } @Value("${task.pool.queue-capacity}") public void setQueueCapacity(int queueCapacity) { AsyncExecutor.queueCapacity = queueCapacity; } /** * 自定义线程池,用法 @Async * @return Executor */ @Override public Executor getAsyncExecutor() { // 自定义工厂 ThreadFactory factory = r -> new Thread(r, "el-async-" + new AtomicInteger(1).getAndIncrement()); // 自定义线程池 return new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveSeconds, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueCapacity), factory, new ThreadPoolExecutor.CallerRunsPolicy()); } /** * 自定义线程池,用法,注入到类中使用 * private ThreadPoolTaskExecutor taskExecutor; * @return ThreadPoolTaskExecutor */ @Bean("taskAsync") public ThreadPoolTaskExecutor taskAsync() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(4); executor.setQueueCapacity(20); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("el-task-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } }