在Java中,通常会通过多线程+线程池的方式以支持并发,我们设想这么一种场景,当前有个业务需要调用另外一个接口,但是这个接口响应速度较慢,如果直接同步调用我们需要等待接口响应返回,再把结果反馈给用户,本身业务本身不强调实时,但是等待的时间反馈的时间稍长则会导致用户体验不佳,而且大多数接口都需要快速响应,不能有明显的延迟,即我调用了接口则马上返回,然后通过线程在后台进行处理,SprinBoot封装了线程池以及提供了​​@Async​​注解用于方便的多线程编程。

首先自定义线程池,这里可以使用Spring提供的​​ThreadPoolTaskExecutor​​,如果需要资源隔离则可以定义多个

@Configuration
public class ThreadPoolConfig {
@Bean(name = "uploadTaskExecutor")
public Executor uploadTaskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(5); //线程池活跃的线程数
pool.setMaxPoolSize(10); //线程池最大活跃的线程数
pool.setWaitForTasksToCompleteOnShutdown(true);
pool.setThreadNamePrefix("上传线程");
return pool;
}

@Bean(name = "downloadTaskExecutor")
public Executor downloadTaskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(5); //线程池活跃的线程数
pool.setMaxPoolSize(10); //线程池最大活跃的线程数
pool.setWaitForTasksToCompleteOnShutdown(true);
pool.setThreadNamePrefix("下载线程");
return pool;
}
}


然后通过在方法上标注@Async来使用线程池,如下:

@Async("uploadTaskExecutor")
public void testUpload(){
System.out.println("test");
}