日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot實(shí)現(xiàn)線程池

瀏覽:122日期:2023-03-02 09:45:01

現(xiàn)在由于系統(tǒng)越來(lái)越復(fù)雜,導(dǎo)致很多接口速度變慢,這時(shí)候就會(huì)想到可以利用線程池來(lái)處理一些耗時(shí)并不影響系統(tǒng)的操作。

新建Spring Boot項(xiàng)目1. ExecutorConfig.xml

新建線程池配置文件。

@Configuration@EnableAsyncpublic class ExecutorConfig { private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class); @Value('${async.executor.thread.core_pool_size}') private int corePoolSize; @Value('${async.executor.thread.max_pool_size}') private int maxPoolSize; @Value('${async.executor.thread.queue_capacity}') private int queueCapacity; @Value('${async.executor.thread.name.prefix}') private String namePrefix; @Bean(name = 'asyncServiceExecutor') public Executor asyncServiceExecutor() {logger.info('start asyncServiceExecutor');ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//配置核心線程數(shù)executor.setCorePoolSize(corePoolSize);//配置最大線程數(shù)executor.setMaxPoolSize(maxPoolSize);//配置隊(duì)列大小executor.setQueueCapacity(queueCapacity);//配置線程池中的線程的名稱前綴executor.setThreadNamePrefix(namePrefix);// rejection-policy:當(dāng)pool已經(jīng)達(dá)到max size的時(shí)候,如何處理新任務(wù)// CALLER_RUNS:不在新線程中執(zhí)行任務(wù),而是有調(diào)用者所在的線程來(lái)執(zhí)行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//執(zhí)行初始化executor.initialize();return executor; }}2. application.yml

@Value配置在application.yml,可以參考配置

# 異步線程配置async: executor: thread: # 配置核心線程數(shù) core_pool_size: 10 # 配置最大線程數(shù) max_pool_size: 20 # 配置隊(duì)列大小 queue_capacity: 99999 # 配置線程池中的線程的名稱前綴 name:prefix: async-service-3. AsyncService.java

創(chuàng)建一個(gè) Service 接口,是異步線程的接口,將方法寫(xiě)入其實(shí)現(xiàn)類即可

public interface AsyncService { /** * 執(zhí)行異步任務(wù)的方法,參數(shù)自己可以添加 */ void executeAsync();}4. AsyncServiceImpl.java

實(shí)現(xiàn)類,用來(lái)寫(xiě)業(yè)務(wù)邏輯

@Servicepublic class AsyncServiceImpl implements AsyncService { private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class); @Override @Async('asyncServiceExecutor') public void executeAsync() {logger.info('start executeAsync');System.out.println('異步線程執(zhí)行開(kāi)始了');System.out.println('可以將耗時(shí)的操作放到這里執(zhí)行了');logger.info('end executeAsync'); }}

++將 Service 層的服務(wù)異步化,在executeAsync()方法上增加注解@Async('asyncServiceExecutor'),asyncServiceExecutor方法是前面ExecutorConfig.java中的方法名,表明executeAsync方法進(jìn)入的線程池是asyncServiceExecutor方法創(chuàng)建的。++

5. AsyncController.java

在控制器里面注入AsyncService,調(diào)用其中的方法即可

@Autowiredprivate AsyncService asyncService;@GetMapping('/async')public void async(){ asyncService.executeAsync();}6. 用Postman進(jìn)行測(cè)試

打印log入下

2021-06-16 22:15:47.655 INFO 10516 --- [async-service-5] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:15:47.655 INFO 10516 --- [async-service-5] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:15:47.770 INFO 10516 --- [async-service-1] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:15:47.770 INFO 10516 --- [async-service-1] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:15:47.816 INFO 10516 --- [async-service-2] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:15:47.816 INFO 10516 --- [async-service-2] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:15:48.833 INFO 10516 --- [async-service-3] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:15:48.834 INFO 10516 --- [async-service-3] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:15:48.986 INFO 10516 --- [async-service-4] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:15:48.987 INFO 10516 --- [async-service-4] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync至此簡(jiǎn)單的線程池已經(jīng)實(shí)現(xiàn)了。

5. 將當(dāng)前線程池的運(yùn)行狀況打印出來(lái)

5.1 VisiableThreadPoolTaskExecutor.java

public class VisiableThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { private static final Logger logger = LoggerFactory.getLogger(VisiableThreadPoolTaskExecutor.class); private void showThreadPoolInfo(String prefix) {ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();if (null == threadPoolExecutor) { return;}logger.info('{}, {},taskCount [{}], completedTaskCount [{}], activeCount [{}], queueSize [{}]',this.getThreadNamePrefix(),prefix,threadPoolExecutor.getTaskCount(),threadPoolExecutor.getCompletedTaskCount(),threadPoolExecutor.getActiveCount(),threadPoolExecutor.getQueue().size()); } @Override public void execute(Runnable task) {showThreadPoolInfo('1. do execute');super.execute(task); } @Override public void execute(Runnable task, long startTimeout) {showThreadPoolInfo('2. do execute');super.execute(task, startTimeout); } @Override public Future<?> submit(Runnable task) {showThreadPoolInfo('1. do submit');return super.submit(task); } @Override public <T> Future<T> submit(Callable<T> task) {showThreadPoolInfo('2. do submit');return super.submit(task); } @Override public ListenableFuture<?> submitListenable(Runnable task) {showThreadPoolInfo('1. do submitListenable');return super.submitListenable(task); } @Override public <T> ListenableFuture<T> submitListenable(Callable<T> task) {showThreadPoolInfo('2. do submitListenable');return super.submitListenable(task); }}

5.2 修改asyncServiceExecutor.java

修改ExecutorConfig.java的asyncServiceExecutor方法,將ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor()改為T(mén)hreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor()

@Bean(name = 'asyncServiceExecutor') public Executor asyncServiceExecutor() {logger.info('start asyncServiceExecutor');//在這里修改ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();//配置核心線程數(shù)executor.setCorePoolSize(corePoolSize);//配置最大線程數(shù)executor.setMaxPoolSize(maxPoolSize);//配置隊(duì)列大小executor.setQueueCapacity(queueCapacity);//配置線程池中的線程的名稱前綴executor.setThreadNamePrefix(namePrefix);// rejection-policy:當(dāng)pool已經(jīng)達(dá)到max size的時(shí)候,如何處理新任務(wù)// CALLER_RUNS:不在新線程中執(zhí)行任務(wù),而是有調(diào)用者所在的線程來(lái)執(zhí)行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//執(zhí)行初始化executor.initialize();return executor; }

5.3 使用Postman進(jìn)行測(cè)試

2021-06-16 22:23:30.951 INFO 14088 --- [nio-8087-exec-2] u.d.e.e.i.VisiableThreadPoolTaskExecutor : async-service-, 2. do submit,taskCount [0], completedTaskCount [0], activeCount [0], queueSize [0]2021-06-16 22:23:30.952 INFO 14088 --- [async-service-1] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:23:30.953 INFO 14088 --- [async-service-1] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:23:31.351 INFO 14088 --- [nio-8087-exec-3] u.d.e.e.i.VisiableThreadPoolTaskExecutor : async-service-, 2. do submit,taskCount [1], completedTaskCount [1], activeCount [0], queueSize [0]2021-06-16 22:23:31.353 INFO 14088 --- [async-service-2] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:23:31.353 INFO 14088 --- [async-service-2] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:23:31.927 INFO 14088 --- [nio-8087-exec-5] u.d.e.e.i.VisiableThreadPoolTaskExecutor : async-service-, 2. do submit,taskCount [2], completedTaskCount [2], activeCount [0], queueSize [0]2021-06-16 22:23:31.929 INFO 14088 --- [async-service-3] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:23:31.930 INFO 14088 --- [async-service-3] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync2021-06-16 22:23:32.496 INFO 14088 --- [nio-8087-exec-7] u.d.e.e.i.VisiableThreadPoolTaskExecutor : async-service-, 2. do submit,taskCount [3], completedTaskCount [3], activeCount [0], queueSize [0]2021-06-16 22:23:32.498 INFO 14088 --- [async-service-4] c.u.d.e.executor.impl.AsyncServiceImpl : start executeAsync異步線程執(zhí)行開(kāi)始了可以將耗時(shí)的操作放到這里執(zhí)行了2021-06-16 22:23:32.499 INFO 14088 --- [async-service-4] c.u.d.e.executor.impl.AsyncServiceImpl : end executeAsync

可以看到上面async-service-, 2. do submit,taskCount [3], completedTaskCount [3], activeCount [0], queueSize [0]關(guān)于線程的信息都打印出來(lái)了。

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)線程池的文章就介紹到這了,更多相關(guān)SpringBoot 線程池內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲毛片一区| 亚洲激情二区| 国产精品红桃| 91成人在线精品视频| 欧美一区久久| 免费在线亚洲| 日韩理论视频| 91九色精品| 亚洲香蕉久久| 蜜桃免费网站一区二区三区 | 亚洲精品精选| 7777精品| 精品亚洲a∨| 亚洲a一区二区三区| 欧美精品一线| 亚洲精品日韩久久| 国产精品a久久久久| 日韩av有码| 五月综合激情| 日韩一区二区三免费高清在线观看| 欧美精品国产| av最新在线| 亚洲激情中文| 亚洲精品系列| 国产一区二区视频在线看| 亚洲国产专区校园欧美| 综合欧美亚洲| 九九99久久精品在免费线bt| 国产在线看片免费视频在线观看| 久久精品播放| 日本亚洲三级在线| 久久中文字幕导航| 美女毛片一区二区三区四区| 天海翼亚洲一区二区三区| 青草av.久久免费一区| 国产a久久精品一区二区三区| 欧美日韩在线二区| 亚州欧美在线| 久久久国产精品入口麻豆| 日韩精品麻豆| 亚洲v天堂v手机在线| 国产成人精品一区二区三区视频 | 日韩欧美三区| av资源新版天堂在线| 亚洲综合另类| 久久精品国产成人一区二区三区| 韩国三级一区| 日韩不卡一二三区| 色婷婷久久久| 69精品国产久热在线观看| 日韩免费福利视频| 日韩综合一区二区三区| 鲁鲁在线中文| 亚洲欧美在线专区| 国产精品99一区二区三| 免费国产亚洲视频| 国产精品伦理久久久久久| 亚洲一区二区三区中文字幕在线观看| 激情综合五月| 亚洲精品少妇| 久久久久国产精品一区三寸| 蜜臀av性久久久久蜜臀aⅴ流畅| 精品国产麻豆| 亚洲最新av| 日韩精品水蜜桃| 国产伦精品一区二区三区视频| 亚洲无线一线二线三线区别av| 久久不见久久见中文字幕免费| 亚洲欧美日韩一区在线观看| 9999国产精品| 日韩精品亚洲aⅴ在线影院| 欧美精品日日操| 国产亚洲精品美女久久 | 久久精品午夜| 亚洲青青久久| 午夜久久一区| 精品国产精品久久一区免费式| 少妇精品久久久| 欧美另类专区| 日韩精品电影| 欧美国产专区| 日韩精品91亚洲二区在线观看| 欧美 日韩 国产精品免费观看| 久久不见久久见国语| 一级欧美视频| 一区在线免费观看| 天堂√8在线中文| 午夜久久一区| 国产精品精品国产一区二区| 欧美日韩1区| 一区二区不卡| 五月天久久久| 久久久久网站| 国产成人精品999在线观看| 日本视频中文字幕一区二区三区| 在线亚洲自拍| 免费视频亚洲| 99精品在线观看| 国产综合色区在线观看| 国产一区二区亚洲| 麻豆国产精品视频| 日韩av一区二区三区| 美国欧美日韩国产在线播放| 五月天综合网站| 欧美日一区二区| 99精品国产一区二区三区| 成人国产精品一区二区网站| 老色鬼精品视频在线观看播放| 国产美女精品视频免费播放软件| 日韩精品国产欧美| 日本亚洲欧洲无免费码在线| 伊人精品久久| 日本不卡视频一二三区| 日韩中文字幕一区二区高清99| 日韩专区欧美专区| 久久大逼视频| 婷婷综合激情| 亚洲女同一区| 国产偷自视频区视频一区二区| 不卡在线一区二区| 国产婷婷精品| 蜜桃传媒麻豆第一区在线观看| 亚洲视频国产| 日韩欧美中文字幕一区二区三区 | 亚洲97av| 欧美日本二区| 麻豆精品蜜桃视频网站| 麻豆成人在线观看| 成人高清一区| 色综合五月天| 亚洲播播91| 亚洲激情久久| 蜜桃伊人久久| 91精品麻豆| 精品欧美日韩精品| 日韩久久精品| 国产99精品一区| 红桃视频国产一区| 亚洲人www| 国产欧美精品| 精品国产黄a∨片高清在线| 福利一区二区免费视频| 日韩欧美一区二区三区在线视频| 久久精品青草| 国产精品日本| 欧美亚洲三区| 国产成人精选| 免费国产自久久久久三四区久久| 香蕉久久久久久久av网站| 日本色综合中文字幕| 久久久久亚洲精品中文字幕| 亚洲精品福利电影| 亚洲精品极品少妇16p| 久久国产精品久久久久久电车| 日韩欧美美女在线观看| 麻豆一区二区99久久久久| 欧美羞羞视频| 久久午夜精品| 国产日韩在线观看视频| 久久不见久久见国语| 亚洲免费福利| 香蕉久久夜色精品国产| 国产欧美久久一区二区三区| 日韩大片在线| 亚洲视频电影在线| 国产在视频一区二区三区吞精| 欧美日韩精品一区二区视频| 自拍自偷一区二区三区| 美女视频一区在线观看| 136国产福利精品导航网址| 亚洲三级观看| 在线天堂中文资源最新版| 美女久久网站| 精品视频久久| 亚洲欧美日韩国产| 久久精品国产在热久久| 婷婷成人基地| 国产欧美日韩精品高清二区综合区| 日本午夜大片a在线观看| 综合激情网站| 色网在线免费观看| 日韩精品午夜视频| 99久久亚洲精品蜜臀| 欧美中文高清| 欧美日韩国产免费观看视频| 国产精品一区二区免费福利视频| 九色精品91| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产成人精品免费视| 免费精品视频| 国产成人精品福利| 日韩精品一级中文字幕精品视频免费观看| 美女视频黄免费的久久| 99视频一区| 精品国产乱码| 日韩在线电影| 久久久夜夜夜| 麻豆精品少妇| 亚洲乱亚洲高清| 亚洲国内精品|