网络 IO, 相对来说是比较耗时的操作,完全可以放到异步线程中来处理,以提升接口的响应速度。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author Edwin
* @date 2/22/2025 10:34 PM
* @description: 自定义线程池
*/
@Configuration
public class ThreadPoolConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数,线程池的基本大小,这些线程会一直存在
executor.setCorePoolSize(10);
// 最大线程数,中允许创建的最大线程数
executor.setMaxPoolSize(50);
// 队列容量,任务队列用于保存等待执行的任务
executor.setQueueCapacity(200);
// 多余的空余线程活跃时间(秒)
executor.setKeepAliveSeconds(30);
// 线程名前缀
executor.setThreadNamePrefix("Executor-");
// 拒绝策略:由调用线程处理(一般为主线程)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
// 设置等待时间,如果超过这个时间还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是被没有完成的任务阻塞
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
调用:
@Resource(name = "taskExecutor")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
void testThreadPoll() {
threadPoolTaskExecutor.submit(() -> log.info("异步线程中说: dubdublablablablabla"));
}