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

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

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

瀏覽:167日期: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久久,三上悠亚国产精品一区二区三区
欧美亚洲网站| 99视频在线精品国自产拍免费观看| 99re国产精品| 亚洲神马久久| 一区二区三区网站| 日本亚洲欧美天堂免费| 亚洲精品少妇| 久久国产人妖系列| 精品亚洲a∨| 97精品一区| 精品欧美视频| 成人亚洲一区| 99精品一区| 在线亚洲精品| 日本午夜精品视频在线观看| 国产欧美视频在线| 国产精品成久久久久| 久久中文字幕av一区二区不卡| 国产精品88久久久久久| 久久av在线| 国产精品亲子伦av一区二区三区 | 欧美gv在线| 怡红院精品视频在线观看极品| 先锋影音国产一区| 婷婷精品在线| 国产精品亚洲综合在线观看| 丁香婷婷久久| 亚洲精品一区二区在线看| 一区二区三区四区日韩| 国产精品午夜一区二区三区| 伊伊综合在线| 男人的天堂亚洲一区| 日韩黄色在线观看| 97精品国产| 视频一区二区中文字幕| 国产精品啊v在线| 成人午夜国产| 亚洲精品乱码| 精品国产网站| 91精品亚洲| 亚洲精品综合| 精品日韩一区| 天堂成人国产精品一区| 欧美激情麻豆| 午夜欧美精品久久久久久久| 欧美在线精品一区| 欧洲精品一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 免费在线亚洲欧美| 黄色成人91| 麻豆精品在线播放| 黄色国产精品| 久久久久伊人| 亚洲在线一区| 欧美激情 亚洲a∨综合| 亚洲欧美日韩综合国产aⅴ| 欧美国产日本| 亚洲三级毛片| 精品欧美一区二区三区在线观看| 久久亚洲欧洲| 日韩精品dvd| 欧美亚洲福利| 一区二区亚洲精品| 韩国一区二区三区视频| 噜噜噜躁狠狠躁狠狠精品视频| 麻豆精品在线播放| 蜜臀精品久久久久久蜜臀| 正在播放日韩精品| 91精品日本| 亚州av乱码久久精品蜜桃| 欧美激情在线精品一区二区三区| 在线综合亚洲| а√天堂8资源中文在线| 亚洲综合福利| 国模 一区 二区 三区| 国产精品1区在线| 亚洲视频播放| 久久久人人人| 精品九九久久| 欧美日韩亚洲一区在线观看| 国产一级久久| 久久免费国产| 另类小说一区二区三区| 亚洲欧美网站在线观看| 蜜桃精品在线| 欧美国产一级| 免费视频一区二区三区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 激情欧美丁香| 精品久久99| 国产亚洲一区| 日韩在线卡一卡二| 激情综合自拍| 九九色在线视频| 麻豆精品在线视频| 国产伦精品一区二区三区在线播放| 亚洲精品少妇| 蜜桃久久av一区| 免费不卡中文字幕在线| 日韩啪啪电影网| 国产一区二区三区国产精品| 国产精品高清一区二区| 久久久成人网| 久久久久.com| 久久理论电影| 99国产精品一区二区| sm捆绑调教国产免费网站在线观看| 里番精品3d一二三区| 久久成人高清| 欧美日韩一区自拍| 欧美一区激情| 国产精品扒开腿做爽爽爽软件| 国产欧美精品久久| 国产欧美丝祙| 欧美国产另类| 精品日韩一区| 亚洲综合电影| 日韩啪啪电影网| 欧美丝袜一区| 欧美影院三区| 九一精品国产| 亚洲福利国产| 日韩午夜av| 免费成人在线观看| 日韩影院免费视频| 亚洲伊人精品酒店| 日韩中文字幕一区二区高清99| 免费成人在线观看| 日本va欧美va瓶| 欧美三级第一页| 欧美成人aaa| sm久久捆绑调教精品一区| 蜜臀久久精品| 在线一区免费| 视频国产精品| 国产日产精品_国产精品毛片| 久久国产人妖系列| 精品一区二区三区亚洲| 三上亚洲一区二区| 香蕉成人av| 五月综合激情| 日韩激情一二三区| 精品一区视频| 久久久9色精品国产一区二区三区| 久久久久久久久99精品大| 欧美成人综合| 深夜日韩欧美| 欧美国产不卡| 亚洲成av在线| 五月天久久网站| 亚洲精品一区二区在线播放∴| 欧美精品中文| 天堂8中文在线最新版在线| 午夜欧美在线| 日韩av午夜在线观看| 国产精品黄色片| 少妇精品导航| 亚洲精品亚洲人成在线观看| 麻豆国产一区| 亚洲国产一区二区在线观看| 亚洲va久久久噜噜噜久久| 久久成人福利| 亚洲一级黄色| 国产午夜精品一区在线观看| 中文av在线全新| 性欧美长视频| 久久影院资源站| 伊人久久亚洲影院| 国产精品115| 激情久久久久久久| 欧美日韩亚洲一区在线观看| 午夜久久中文| 深夜日韩欧美| 日韩成人亚洲| 7777精品| 免费精品国产的网站免费观看| 91av一区| 免费成人网www| 国产欧美另类| 黄色成人精品网站| 久久91视频| 久久国产精品毛片| 精品一区二区三区视频在线播放| 亚洲精华国产欧美| 久久av免费| 欧美久久精品一级c片| 欧美欧美黄在线二区| 激情欧美国产欧美| 欧美韩一区二区| 免费成人性网站| 中文在线中文资源| 日韩精品欧美成人高清一区二区| 在线天堂资源www在线污| 亚洲精品第一| 激情综合自拍| 国产一区二区三区免费在线| 视频国产精品| 婷婷激情图片久久| 国产在线不卡一区二区三区| 六月天综合网|