SpringBoot 多线程
1. 启动类开启多线程支持
使用 @EnableAsync 来开启 Springboot 对于异步任务的支持
@SpringBootApplication
@EnableAsync // 开启多线程
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
2. 添加配置类
- 配置类实现接口AsyncConfigurator,返回一个ThreadPoolTaskExecutor线程池对象
- ThredPoolTaskExcutor的处理流程 :
- 当池子大小小于corePoolSize,就新建线程,并处理请求
- 当池子大小等于 corePoolSize,把请求放入 workQueue 中,池子里的空闲线程就去workQueue 中取任务并处理
- 当 workQueue 放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了 maximumPoolSize,就用 RejectedExecutionHandler 来做拒绝处理
- 当池子的线程数大于 corePoolSize 时,多余的线程会等待 keepAliveTime 长时间,如果无请求可处理就自行销毁
@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
//设置核心线程数
threadPool.setCorePoolSize(10);
//设置最大线程数
threadPool.setMaxPoolSize(100);
//线程池所使用的缓冲队列
threadPool.setQueueCapacity(10);
//等待任务在关机时完成--表明等待所有线程执行完
threadPool.setWaitForTasksToCompleteOnShutdown(true);
// 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
threadPool.setAwaitTerminationSeconds(60);
// 线程名称前缀
threadPool.setThreadNamePrefix("Derry-Async-");
// 初始化线程
threadPool.initialize();
return threadPool;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
3. @Async 注解
通过 @Async 注解表明该方法是异步方法,如果注解在类上,那表明这个类里面的所有方法都是异步的
@Service
public class AsyncTaskService {
@Async
public void executeAsyncTask(int i) {
System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
}
}
- 测试
@RunWith (SpringRunner.class) @SpringBootTest public class SpringbootLearnApplicationTests { @Autowired private AsyncTaskService asyncTaskService; @Test public void threadTest() { for (int i = 0; i < 20; i++) { asyncTaskService.executeAsyncTask(i); } } }
- 执行结果:
线程Derry-Async-1 执行异步任务:0 线程Derry-Async-1 执行异步任务:10 线程Derry-Async-1 执行异步任务:11 线程Derry-Async-2 执行异步任务:1 线程Derry-Async-6 执行异步任务:5 线程Derry-Async-6 执行异步任务:14 线程Derry-Async-6 执行异步任务:15 线程Derry-Async-6 执行异步任务:16 线程Derry-Async-7 执行异步任务:6 线程Derry-Async-6 执行异步任务:17 线程Derry-Async-6 执行异步任务:19 线程Derry-Async-3 执行异步任务:2 线程Derry-Async-9 执行异步任务:8 线程Derry-Async-5 执行异步任务:4 线程Derry-Async-2 执行异步任务:13 线程Derry-Async-8 执行异步任务:7 线程Derry-Async-1 执行异步任务:12 线程Derry-Async-10 执行异步任务:9 线程Derry-Async-4 执行异步任务:3 线程Derry-Async-7 执行异步任务:18
参考博客:CSDN博主「小鹅鹅」