1.提供公共的线程池工具类,示例:
private static ThreadPoolTaskExecutor taskExecutor = null;
private static Integer corePoolSize = 10;
private static Integer maxPoolSize = 20;
private static Integer queueCapacity = 1000;
static {
taskExecutor = new ThreadPoolTaskExecutor();
// 核心线程数,队列未满之前可执行线程数是按照 core的size
taskExecutor.setCorePoolSize(corePoolSize);
// 最大线程数,原来50 8.10号改为20,队列满的时候执行线程数为max的size
taskExecutor.setMaxPoolSize(maxPoolSize);
// 队列最大长度
taskExecutor.setQueueCapacity(queueCapacity);
// 线程池维护线程所允许的空闲时间(单位秒)
taskExecutor.setKeepAliveSeconds(120);
// 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
taskExecutor.initialize();
}
public static void run(Runnable runnable) {
taskExecutor.execute(runnable);
}
调用示例:
ThreadTaskUtils.run(new Runnable() {
public void run() {
log.info("异步线程");
}
});
2.使用spring注解,自主配置线程池信息,在项目中加入下面代码:
@Bean(name = "threadPoolTask")
public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {
logger.info("threadPoolTask start...");
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(15);
taskExecutor.setMaxPoolSize(50);
taskExecutor.setQueueCapacity(5000);// 队列最大长度
taskExecutor.setKeepAliveSeconds(200); // 线程池维护线程所允许的空闲时间
taskExecutor.setThreadNamePrefix("test-pool-");
// 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 调度器shutdown被调用时等待当前被调度的任务完成
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
// 等待时长
taskExecutor.setAwaitTerminationSeconds(60);
taskExecutor.initialize();
return taskExecutor;
}
在需要使用异步的位置,加上注解:@Async("threadPoolTask");
在启动类加上注解:@EnableAsync
注意事项:在调用本类子方法时,方法上加上注解无效,示例:
public void autoCheck() {
checkOrder();
}
@Async("scheduledPoolTaskExecutor")
public void checkOrder() {
}
使用上面的写法,异步不生效。