SpringBoot 多線程
1. 啟動(dòng)類開(kāi)啟多線程支持
使用 @EnableAsync 來(lái)開(kāi)啟 Springboot 對(duì)于異步任務(wù)的支持
@SpringBootApplication
@EnableAsync // 開(kāi)啟多線程
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
2. 添加配置類
- 配置類實(shí)現(xiàn)接口AsyncConfigurator,返回一個(gè)ThreadPoolTaskExecutor線程池對(duì)象
- ThredPoolTaskExcutor的處理流程 :
- 當(dāng)池子大小小于corePoolSize,就新建線程,并處理請(qǐng)求
- 當(dāng)池子大小等于 corePoolSize,把請(qǐng)求放入 workQueue 中,池子里的空閑線程就去workQueue 中取任務(wù)并處理
- 當(dāng) workQueue 放不下任務(wù)時(shí),就新建線程入池,并處理請(qǐng)求,如果池子大小撐到了 maximumPoolSize,就用 RejectedExecutionHandler 來(lái)做拒絕處理
- 當(dāng)池子的線程數(shù)大于 corePoolSize 時(shí),多余的線程會(huì)等待 keepAliveTime 長(zhǎng)時(shí)間,如果無(wú)請(qǐng)求可處理就自行銷毀
@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
//設(shè)置核心線程數(shù)
threadPool.setCorePoolSize(10);
//設(shè)置最大線程數(shù)
threadPool.setMaxPoolSize(100);
//線程池所使用的緩沖隊(duì)列
threadPool.setQueueCapacity(10);
//等待任務(wù)在關(guān)機(jī)時(shí)完成--表明等待所有線程執(zhí)行完
threadPool.setWaitForTasksToCompleteOnShutdown(true);
// 等待時(shí)間 (默認(rèn)為0,此時(shí)立即停止),并沒(méi)等待xx秒后強(qiáng)制停止
threadPool.setAwaitTerminationSeconds(60);
// 線程名稱前綴
threadPool.setThreadNamePrefix("Derry-Async-");
// 初始化線程
threadPool.initialize();
return threadPool;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
3. @Async 注解
通過(guò) @Async 注解表明該方法是異步方法,如果注解在類上,那表明這個(gè)類里面的所有方法都是異步的
@Service
public class AsyncTaskService {
@Async
public void executeAsyncTask(int i) {
System.out.println("線程" + Thread.currentThread().getName() + " 執(zhí)行異步任務(wù):" + i);
}
}
- 測(cè)試
@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); } } }
- 執(zhí)行結(jié)果:
線程Derry-Async-1 執(zhí)行異步任務(wù):0 線程Derry-Async-1 執(zhí)行異步任務(wù):10 線程Derry-Async-1 執(zhí)行異步任務(wù):11 線程Derry-Async-2 執(zhí)行異步任務(wù):1 線程Derry-Async-6 執(zhí)行異步任務(wù):5 線程Derry-Async-6 執(zhí)行異步任務(wù):14 線程Derry-Async-6 執(zhí)行異步任務(wù):15 線程Derry-Async-6 執(zhí)行異步任務(wù):16 線程Derry-Async-7 執(zhí)行異步任務(wù):6 線程Derry-Async-6 執(zhí)行異步任務(wù):17 線程Derry-Async-6 執(zhí)行異步任務(wù):19 線程Derry-Async-3 執(zhí)行異步任務(wù):2 線程Derry-Async-9 執(zhí)行異步任務(wù):8 線程Derry-Async-5 執(zhí)行異步任務(wù):4 線程Derry-Async-2 執(zhí)行異步任務(wù):13 線程Derry-Async-8 執(zhí)行異步任務(wù):7 線程Derry-Async-1 執(zhí)行異步任務(wù):12 線程Derry-Async-10 執(zhí)行異步任務(wù):9 線程Derry-Async-4 執(zhí)行異步任務(wù):3 線程Derry-Async-7 執(zhí)行異步任務(wù):18
參考博客:CSDN博主「小鵝鵝」