SpringBoot 多線性開(kāi)發(fā)

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. 添加配置類

  1. 配置類實(shí)現(xiàn)接口AsyncConfigurator,返回一個(gè)ThreadPoolTaskExecutor線程池對(duì)象
  2. ThredPoolTaskExcutor的處理流程 :
    1. 當(dāng)池子大小小于corePoolSize,就新建線程,并處理請(qǐng)求
    2. 當(dāng)池子大小等于 corePoolSize,把請(qǐng)求放入 workQueue 中,池子里的空閑線程就去workQueue 中取任務(wù)并處理
    3. 當(dāng) workQueue 放不下任務(wù)時(shí),就新建線程入池,并處理請(qǐng)求,如果池子大小撐到了 maximumPoolSize,就用 RejectedExecutionHandler 來(lái)做拒絕處理
    4. 當(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);
    }
}
  1. 測(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);
     }
 }

}
  1. 執(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博主「小鵝鵝」

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:肥肥魚(yú)鏈接:https://www.zhihu.com/question/30804052/answer/4...
    TTTqiu閱讀 1,062評(píng)論 0 4
  • 定義類 重要變量 1 ThreadPoolExecutor的構(gòu)造方法中各個(gè)參數(shù) ThreadPoolExecuto...
    凱玲之戀閱讀 730評(píng)論 0 0
  • Jhipster版本 4.14.5 注解介紹 在SpringBoot中實(shí)現(xiàn)異步操作需要2個(gè)注解@EnableAsy...
    燕凱凱閱讀 691評(píng)論 1 0
  • 線程池作用 相對(duì)于為每個(gè)請(qǐng)求都創(chuàng)建一個(gè)線程,線程池通過(guò)重用現(xiàn)有的線程而不是創(chuàng)建新線程,可以在處理多個(gè)請(qǐng)求時(shí)分?jǐn)傇诰€...
    Java大生閱讀 1,409評(píng)論 0 31
  • 睿婕生涯微咨詢系列分享之六——關(guān)于自控力 我們是否常常想看書(shū)又堅(jiān)持不下去?是否想減肥又不見(jiàn)效果?是否常??刂撇蛔?..
    睿婕生涯心理咨詢工作室閱讀 692評(píng)論 0 0

友情鏈接更多精彩內(nèi)容