@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。
文章讲述了使用@Async注解时,默认线程池可能导致的内存溢出风险,并提供了一个示例,展示如何自定义线程池以控制核心线程数、工作队列长度等参数。同时强调了启用@Async需添加@EnableAsync注解,且异步方法返回值限制为void或Future。

1191

被折叠的 条评论
为什么被折叠?



