@Async 注解的默认的线程池的核心线程数是8 ,工作队列长度是Integer.MAX_VALUE。如果直接使用默认的线程池有内存溢出的风险。
需要自定义线程池以控制各项参数。
自定义线程池
@Bean(value = "asyncThreadPool")
public ExecutorService asyncThreadPool() {
String threadName = "asyncThread";
AtomicInteger threadNumber = new AtomicInteger(0);
return new ThreadPoolExecutor(
8,
16,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1024),
runnable -> new Thread(runnable, threadName + "-" + threadNumber.getAndIncrement())
);
}
@Async 使用自定义线程池
@Async("asyncThreadPool")
public void demo() {
// TODO something
}
注意事项:
1.在启动类当中没有添加 @EnableAsync 注解。
2.调用 @Async 方法需要走 Spring 的代理类。因为 @Async 注解是基于 Spring AOP 动态代理实现的。
3.异步 @Async 方法返回值只能是 void 或者 Future 类型,其他类型返回值是null。