在单线程模式下,当程序执行一个耗时的操作时,整个程序都会被阻塞,直到该操作完成。这会导致程序的响应速度变慢,用户体验不佳。而异步线程池可以将耗时的操作放到一个单独的线程中执行,使得主线程可以继续执行其他任务,从而提高程序的并发性能和响应速度。
一、自定义线程池配置类
@Configuration
@EnableAsync
public class ExecutorConfig{
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数
executor.setCorePoolSize(10);
//最大线程数
executor.setMaxPoolSize(20);
//任务队列大小
executor.setQueueCapacity(100);
//等待时长
executor.setAwaitTerminationSeconds(60);
//允许线程的空闲时间
executor.setKeepAliveSeconds(60);
executor.setWaitForTasksToCompleteOnShutdown(true);
//线程前缀名
executor.setThreadNamePrefix("thread-pool-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程初始化
executor.initialize();
return executor;
}
}
因注解@congfiguration的配置类会自动将该类注入springboot容器中,因此无需在启动类中配置@EnableAcync异步线程注解。
二、@Async执行异步任务
线程池配好后,通过@Async注解配置到需要执行异步任务的方法上就实现了我们自定义线程池执行异步任务
@Async("taskExecutor") //需指定线程池名称
public void test(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("异步线程执行");
}