如果不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。
定义通用线程池
@EnableAsync @Configuration public class ThreadTestConfig { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); pool.setCorePoolSize(5); //线程池活跃的线程数 pool.setMaxPoolSize(10); //线程池最大活跃的线程数 pool.setWaitForTasksToCompleteOnShutdown(true); pool.setThreadNamePrefix("lalala"); return pool; } }
@Async默认使用Bean Name为executor的线程池。也可以根据Bean Name指定特定线程池
@Async("taskExecuter")
public void asyncMethod() {
sleep(10);
System.out.println("async");
}