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

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

Spring Boot Async異步執(zhí)行任務(wù)過程詳解

瀏覽:161日期:2023-08-21 16:02:55

異步調(diào)用就是不用等待結(jié)果的返回就執(zhí)行后面的邏輯,同步調(diào)用則需要等帶結(jié)果再執(zhí)行后面的邏輯。

通常我們使用異步操作都會(huì)去創(chuàng)建一個(gè)線程執(zhí)行一段邏輯,然后把這個(gè)線程丟到線程池中去執(zhí)行,代碼如下:

ExecutorService executorService = Executors.newFixedThreadPool(10);executorService.execute(() -> { try { // 業(yè)務(wù)邏輯 } catch (Exception e) { e.printStackTrace(); } finally { } });

這樣的方式看起來沒那么優(yōu)雅,盡管用了java的lambda。在Spring Boot中有一種更簡單的方式來執(zhí)行異步操作,只需要一個(gè)@Async注解即可。

@Asyncpublic void saveLog() { System.err.println(Thread.currentThread().getName());}

我們可以直接在Controller中調(diào)用這個(gè)業(yè)務(wù)方法,它就是異步執(zhí)行的,會(huì)在默認(rèn)的線程池中去執(zhí)行。需要注意的是一定要在外部的類中去調(diào)用這個(gè)方法,如果在本類調(diào)用是不起作用的,比如this.saveLog()。 最后在啟動(dòng)類上開啟異步任務(wù)的執(zhí)行,添加@EnableAsync即可。

另外關(guān)于執(zhí)行異步任務(wù)的線程池我們也可以自定義,首先我們定義一個(gè)線程池的配置類,用來配置一些參數(shù),具體代碼如下:

import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration; /** * 異步任務(wù)線程池配置 * * @author yinjihuan */@Configuration@ConfigurationProperties(prefix = 'spring.task.pool')public class TaskThreadPoolConfig { //核心線程數(shù) private int corePoolSize = 5; //最大線程數(shù) private int maxPoolSize = 50; //線程池維護(hù)線程所允許的空閑時(shí)間 private int keepAliveSeconds = 60; //隊(duì)列長度 private int queueCapacity = 10000; //線程名稱前綴 private String threadNamePrefix = 'FSH-AsyncTask-'; public String getThreadNamePrefix() { return threadNamePrefix; } public void setThreadNamePrefix(String threadNamePrefix) { this.threadNamePrefix = threadNamePrefix; } public int getCorePoolSize() { return corePoolSize; } public void setCorePoolSize(int corePoolSize) { this.corePoolSize = corePoolSize; } public int getMaxPoolSize() { return maxPoolSize; } public void setMaxPoolSize(int maxPoolSize) { this.maxPoolSize = maxPoolSize; } public int getKeepAliveSeconds() { return keepAliveSeconds; } public void setKeepAliveSeconds(int keepAliveSeconds) { this.keepAliveSeconds = keepAliveSeconds; } public int getQueueCapacity() { return queueCapacity; } public void setQueueCapacity(int queueCapacity) { this.queueCapacity = queueCapacity; }}

然后我們重新定義線程池的配置:

import java.lang.reflect.Method;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.AsyncConfigurer;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration public class AsyncTaskExecutePool implements AsyncConfigurer { private Logger logger = LoggerFactory.getLogger(AsyncTaskExecutePool.class); @Autowired private TaskThreadPoolConfig config; @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(config.getCorePoolSize()); executor.setMaxPoolSize(config.getMaxPoolSize()); executor.setQueueCapacity(config.getQueueCapacity()); executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); executor.setThreadNamePrefix(config.getThreadNamePrefix()); //線程池對(duì)拒絕任務(wù)(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy //AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 --> //CallerRunsPolicy:主線程直接執(zhí)行該任務(wù),執(zhí)行完之后嘗試添加下一個(gè)任務(wù)到線程池中,可以有效降低向線程池內(nèi)添加任務(wù)的速度 --> //DiscardOldestPolicy:拋棄舊的任務(wù)、暫不支持;會(huì)導(dǎo)致被丟棄的任務(wù)無法再次被執(zhí)行 --> //DiscardPolicy:拋棄當(dāng)前任務(wù)、暫不支持;會(huì)導(dǎo)致被丟棄的任務(wù)無法再次被執(zhí)行 --> executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {// 異步任務(wù)中異常處理 return new AsyncUncaughtExceptionHandler() { @Override public void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) { logger.error('=========================='+arg0.getMessage()+'=======================', arg0); logger.error('exception method:' + arg1.getName()); } }; } }

配置完之后我們的異步任務(wù)執(zhí)行的線程池就是我們自定義的了,我們可以通過在屬性文件里面配置線程池的大小等等信息,也可以使用默認(rèn)的配置:

spring.task.pool.maxPoolSize=100

最后講下線程池配置的拒絕策略,當(dāng)我們的線程數(shù)量高于線程池的處理速度時(shí),任務(wù)會(huì)被緩存到本地的隊(duì)列中,隊(duì)列也是有大小的,如果超過了這個(gè)大小,我們需要有拒絕的策略,不然就會(huì)內(nèi)存溢出了,目前支持2種拒絕策略:

AbortPolicy: 直接拋出java.util.concurrent.RejectedExecutionException異常 CallerRunsPolicy: 主線程直接執(zhí)行該任務(wù),執(zhí)行完之后嘗試添加下一個(gè)任務(wù)到線程池中,可以有效降低向線程池內(nèi)添加任務(wù)的速度 建議大家用CallerRunsPolicy策略,因?yàn)楫?dāng)隊(duì)列中的任務(wù)滿了之后,如果直接拋異常,那么這個(gè)任務(wù)就會(huì)被丟棄,如果是CallerRunsPolicy策略會(huì)用主線程去執(zhí)行,就是同步執(zhí)行,最起碼這樣任務(wù)不會(huì)丟棄。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美自拍一区| 欧美精品资源| 亚洲伊人精品酒店| 午夜日本精品| 午夜精品亚洲| 国产视频一区免费看| 亚洲欧美日韩专区| 日韩中文字幕1| 91久久久久| 免费日韩av片| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 日韩专区视频网站| 亚洲婷婷丁香| 欧美在线精品一区| 久久精品三级| 日韩大片在线| 亚洲美洲欧洲综合国产一区| 国产精品社区| 最新国产精品久久久| 91成人小视频| 四虎国产精品免费观看| 久久国产亚洲精品| 久久精品超碰| 日韩成人a**站| 欧美精品一区二区三区精品| 亚洲v在线看| 精品欠久久久中文字幕加勒比| 久久三级福利| 美腿丝袜亚洲三区| 日韩国产一区| 午夜免费一区| 卡一精品卡二卡三网站乱码| 天堂av在线一区| 婷婷综合五月| 久久精品在线| av不卡在线| 欧美中文高清| 欧洲精品一区二区三区| 国产亚洲网站| 欧美国产极品| av亚洲在线观看| 欧美亚洲一区二区三区| sm久久捆绑调教精品一区| 最新亚洲一区| 国产精品一区二区三区av| 国产传媒av在线| 99riav国产精品| 国产精品亚洲片在线播放| 久久影院午夜精品| 国产视频久久| 欧美激情日韩| 香蕉国产精品| 国产精品观看| 欧美日韩国产传媒| 欧美国产免费| 一区二区自拍| 国产免费av国片精品草莓男男| 日韩欧美看国产| 亚洲aa在线| 欧美天堂视频| 日韩av一区二| 欧美在线观看视频一区| 日韩av网站在线免费观看| 精品三级久久久| 亚洲国产日韩欧美在线| 国产精品三p一区二区| 欧美午夜不卡影院在线观看完整版免费| 欧美日韩 国产精品| 亚洲性视频h| 国产精品videossex久久发布| 日韩高清在线不卡| 老司机精品久久| 日韩精品欧美激情一区二区| 日韩一区二区三区在线看| 亚洲欧美激情诱惑| 日韩av三区| 国产九一精品| 久久久久99| 久久国产精品亚洲77777| 欧美亚洲三区| 欧美日韩国产传媒| 麻豆国产精品777777在线| 国产精品91一区二区三区| 欧美日韩网址| 午夜久久黄色| 亚洲美女久久精品| 国产亚洲第一伦理第一区| 日韩视频在线一区二区三区| 成人国产精品一区二区免费麻豆| 亚洲欧洲美洲国产香蕉| 在线成人动漫av| 精品三区视频| 日本精品久久| 激情综合自拍| 日韩黄色大片| 精品欠久久久中文字幕加勒比| 日韩亚洲精品在线观看| 日韩一级网站| 在线日韩一区| 国产资源在线观看入口av| 国产免费av国片精品草莓男男| 亚洲最新av| 日韩一级欧洲| 蜜桃视频欧美| 久久久久99| 日韩精品91| 在线看片福利| 精品亚洲a∨| 日本在线一区二区三区| 狠狠久久婷婷| 亚洲高清不卡| 999国产精品999久久久久久| av资源中文在线| 精品高清久久| 精品国产亚洲一区二区三区| 国产精品亚洲综合久久| 日韩三级视频| 亚洲久久在线| 玖玖精品视频| 亚洲久久一区| 免费人成在线不卡| 久久久久久久欧美精品| 免费在线小视频| 91欧美日韩在线| 蜜桃传媒麻豆第一区在线观看| 午夜国产欧美理论在线播放| 天堂网av成人| 欧美~级网站不卡| 欧美日韩水蜜桃| 激情综合自拍| 亚洲激情中文| 另类激情亚洲| 婷婷综合成人| 国产精品一区2区3区| 国产毛片精品| 国产精品2区| 国产欧美亚洲精品a| 国产亚洲第一伦理第一区| 亚洲乱码视频| 日本va欧美va欧美va精品| 欧美日韩一区二区三区在线电影| 国产欧美亚洲精品a| 国产高清视频一区二区| 欧美精品二区| av在线资源| 久久精品高清| 尤物精品在线| 中文在线一区| 一区二区精彩视频| 青青草精品视频| 99精品视频在线观看免费播放| 色综合狠狠操| 天堂日韩电影| 国精品一区二区三区| 亚洲精品四区| 久久精品 人人爱| 国产亚洲一区二区三区啪| 亚洲三级毛片| 国产欧美91| 亚洲精品麻豆| 色在线中文字幕| 亚洲一级大片| 中文在线资源| 国产伦精品一区二区三区视频 | 中文字幕在线官网| 中文av在线全新| 亚洲精品va| 91嫩草精品| 天堂а√在线最新版中文在线| 亚洲女同中文字幕| 日韩黄色av| 日本黄色精品| 国产一区导航| 国产欧美日韩一区二区三区四区 | 欧美日韩精品免费观看视欧美高清免费大片| 久久久夜精品| 亚洲资源在线| 国产精品久久久久av蜜臀 | 欧美日韩国产一区精品一区| 亚洲日产国产精品| 麻豆91精品91久久久的内涵| 欧美日韩视频免费观看| 亚洲精品美女91| 国产中文欧美日韩在线| 国产精品视区| 精品久久福利| 国产农村妇女精品一二区| 国产精品亚洲一区二区在线观看| 欧美片第1页| 蜜桃视频在线观看一区| 国产精品视频首页| 欧美中文字幕一区二区| 欧美日韩99| 欧美亚洲国产激情| 97久久精品| 亚洲午夜av| 久久99视频| 久久都是精品| 欧美精品1区| 日韩在线观看一区|