亚洲乱淫 I 香蕉成人av I 哺乳期av I 欧美播放器 I 成人私密视频 I 福利小导航 I 男人都懂的网站 I 日韩av网址在线观看 I 91超碰成人 I 色噜噜久久 I av无限看 I 国产综合在线播放 I 亚洲综合免费观看高清完整版 I 双腿张开被9个男人调教 I 欧美裸体xxx I 在线午夜电影 I 日韩女女同性aa女同 I 成人91 I 日本中文字幕免费 I 91久久久国产精品 I 免费观看黄色大片 I 伊人天堂视频 I 欧美日韩国产999 I 操人黄色 I 久久久久久性高 I 亚洲综合熟女久久久30p I 视频二区最新视频 I 亚洲国产成人二区 I 岛国黄色专区 I 亚洲www. I 欧美特黄视频在线观看 I 黄色三级软件 I 国产9页 I 久久动漫av I 免费看18禁止观看黄网站 I 青青久在线视观看视 I 欧美一夜爽爽爽爽爽爽 I 波多野结衣vs黑人 I 国产最爽乱淫视频免费

[線程池]Springboot如何使用線程池

來源:騰訊云

本文帶你快速了解@Async注解的用法,包括異步方法無返回值、有返回值,最后總結(jié)了@Async注解失效的幾個(gè)坑。

在 SpringBoot 應(yīng)用中,經(jīng)常會(huì)遇到在一個(gè)接口中,同時(shí)做事情1,事情2,事情3,如果同步執(zhí)行的話,則本次接口時(shí)間取決于事情1 2 3執(zhí)行時(shí)間之和;如果三件事同時(shí)執(zhí)行,則本次接口時(shí)間取決于事情1 2 3執(zhí)行時(shí)間最長的那個(gè),合理使用多線程,可以大大縮短接口時(shí)間。那么在 SpringBoot 應(yīng)用中如何優(yōu)雅的使用多線程呢?

Don"t bb, show me code.


(相關(guān)資料圖)

快速使用

SpringBoot應(yīng)用中需要添加@EnableAsync注解,來開啟異步調(diào)用,一般還會(huì)配置一個(gè)線程池,異步的方法交給特定的線程池完成,如下:

@Configuration@EnableAsyncpublic class AsyncConfiguration {    @Bean("doSomethingExecutor")    public Executor doSomethingExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // 核心線程數(shù):線程池創(chuàng)建時(shí)候初始化的線程數(shù)        executor.setCorePoolSize(10);        // 最大線程數(shù):線程池最大的線程數(shù),只有在緩沖隊(duì)列滿了之后才會(huì)申請(qǐng)超過核心線程數(shù)的線程        executor.setMaxPoolSize(20);        // 緩沖隊(duì)列:用來緩沖執(zhí)行任務(wù)的隊(duì)列        executor.setQueueCapacity(500);        // 允許線程的空閑時(shí)間60秒:當(dāng)超過了核心線程之外的線程在空閑時(shí)間到達(dá)之后會(huì)被銷毀        executor.setKeepAliveSeconds(60);        // 線程池名的前綴:設(shè)置好了之后可以方便我們定位處理任務(wù)所在的線程池        executor.setThreadNamePrefix("do-something-");        // 緩沖隊(duì)列滿了之后的拒絕策略:由調(diào)用線程處理(一般是主線程)        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());        executor.initialize();        return executor;    }}

使用的方式非常簡單,在需要異步的方法上加@Async注解

@RestControllerpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @GetMapping("/open/something")    public String something() {        int count = 10;        for (int i = 0; i < count; i++) {            asyncService.doSomething("index = " + i);        }        lon        return "success";    }}@Slf4j@Servicepublic class AsyncService {    // 指定使用beanname為doSomethingExecutor的線程池    @Async("doSomethingExecutor")    public String doSomething(String message) {        log.info("do something, message={}", message);        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            log.error("do something error: ", e);        }        return message;    }}

訪問:127.0.0.1:8080/open/something,日志如下

2020-04-19 23:42:42.486  INFO 21168 --- [io-8200-exec-17] x.g.b.system.controller.AsyncController  : do something end, time 8 milliseconds2020-04-19 23:42:42.488  INFO 21168 --- [ do-something-1] x.gits.boot.system.service.AsyncService  : do something, message=index = 02020-04-19 23:42:42.488  INFO 21168 --- [ do-something-5] x.gits.boot.system.service.AsyncService  : do something, message=index = 42020-04-19 23:42:42.488  INFO 21168 --- [ do-something-4] x.gits.boot.system.service.AsyncService  : do something, message=index = 32020-04-19 23:42:42.488  INFO 21168 --- [ do-something-6] x.gits.boot.system.service.AsyncService  : do something, message=index = 52020-04-19 23:42:42.488  INFO 21168 --- [ do-something-9] x.gits.boot.system.service.AsyncService  : do something, message=index = 82020-04-19 23:42:42.488  INFO 21168 --- [ do-something-8] x.gits.boot.system.service.AsyncService  : do something, message=index = 72020-04-19 23:42:42.488  INFO 21168 --- [do-something-10] x.gits.boot.system.service.AsyncService  : do something, message=index = 92020-04-19 23:42:42.488  INFO 21168 --- [ do-something-7] x.gits.boot.system.service.AsyncService  : do something, message=index = 62020-04-19 23:42:42.488  INFO 21168 --- [ do-something-2] x.gits.boot.system.service.AsyncService  : do something, message=index = 12020-04-19 23:42:42.488  INFO 21168 --- [ do-something-3] x.gits.boot.system.service.AsyncService  : do something, message=index = 2

由此可見已經(jīng)達(dá)到異步執(zhí)行的效果了,并且使用到了咱們配置的線程池。

獲取異步方法返回值

當(dāng)異步方法有返回值時(shí),如何獲取異步方法執(zhí)行的返回結(jié)果呢?這時(shí)需要異步調(diào)用的方法帶有返回值CompletableFuture。

CompletableFuture是對(duì)Feature的增強(qiáng),F(xiàn)eature只能處理簡單的異步任務(wù),而CompletableFuture可以將多個(gè)異步任務(wù)進(jìn)行復(fù)雜的組合。如下:

@RestControllerpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @SneakyThrows    @ApiOperation("異步 有返回值")    @GetMapping("/open/somethings")    public String somethings() {        CompletableFuture createOrder = asyncService.doSomething1("create order");        CompletableFuture reduceAccount = asyncService.doSomething2("reduce account");        CompletableFuture saveLog = asyncService.doSomething3("save log");        // 等待所有任務(wù)都執(zhí)行完        CompletableFuture.allOf(createOrder, reduceAccount, saveLog).join();        // 獲取每個(gè)任務(wù)的返回結(jié)果        String result = createOrder.get() + reduceAccount.get() + saveLog.get();        return result;    }}@Slf4j@Servicepublic class AsyncService {    @Async("doSomethingExecutor")    public CompletableFuture doSomething1(String message) throws InterruptedException {        log.info("do something1: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("do something1: " + message);    }    @Async("doSomethingExecutor")    public CompletableFuture doSomething2(String message) throws InterruptedException {        log.info("do something2: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("; do something2: " + message);    }    @Async("doSomethingExecutor")    public CompletableFuture doSomething3(String message) throws InterruptedException {        log.info("do something3: {}", message);        Thread.sleep(1000);        return CompletableFuture.completedFuture("; do something3: " + message);    }}

訪問接口

C:\Users\Administrator>curl -X GET "http://localhost:8200/open/somethings" -H "accept: */*"do something1: create order; do something2: reduce account; do something3: save log

控制臺(tái)上關(guān)鍵日志如下:

2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-3] x.gits.boot.system.service.AsyncService  : do something3: save log2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-2] x.gits.boot.system.service.AsyncService  : do something2: reduce account2020-04-20 00:27:42.238  INFO 5672 --- [ do-something-1] x.gits.boot.system.service.AsyncService  : do something1: create order

注意事項(xiàng)

@Async注解會(huì)在以下幾個(gè)場景失效,也就是說明明使用了@Async注解,但就沒有走多線程。

異步方法使用static關(guān)鍵詞修飾;異步類不是一個(gè)Spring容器的bean(一般使用注解@Component@Service,并且能被Spring掃描到);SpringBoot應(yīng)用中沒有添加@EnableAsync注解;在同一個(gè)類中,一個(gè)方法調(diào)用另外一個(gè)有@Async注解的方法,注解不會(huì)生效。原因是@Async注解的方法,是在代理類中執(zhí)行的。

通過上邊幾個(gè)示例,@Async實(shí)際還是通過Future或CompletableFuture來異步執(zhí)行的,Spring又封裝了一下,讓我們使用的更方便。

標(biāo)簽:

推薦

財(cái)富更多》

動(dòng)態(tài)更多》

熱點(diǎn)

主站蜘蛛池模板: 99热最新精品 | 爱色成人网 | 高清破外女出血av毛片 | 看免费真人视频网站 | 在线播放中文字幕 | 欧美 日韩 国产 激情 | 影音先锋手机av资源站 | 欧美一线二线动漫精品 | 激情视频一区 | 久久久精品久久久久久96 | 男女一边摸一边做爽爽的免费阅读 | 亚洲精品第一国产综合麻豆 | 男女啪啪免费观看网站 | 少妇一级淫免费放 | 天天射天天搞 | 夜夜躁狠狠躁2021 | 农村女人十八毛片a级毛片 国产乱子伦一区二区三区四区五区 | 秋霞午夜成人久久电影网 | 国产精品99久久久久久www | 精品国产卡一卡2卡3卡 | 性裸体bbwbbwbbwbbw| av无码国产精品麻豆 | 国产精品国产三级国产av麻豆 | 黑人巨大精品 | 这里只有精品国产 | 女性裸体无遮挡无遮掩视频蜜芽 | 国产宾馆自拍 | 久久99九九精品久久久久蜜桃 | 久久国产精品成人无码网站 | 日韩中文高清在线专区 | 曰批全过程免费视频在线观看无码 | 日本乳喷榨乳奶水视频 | 精品久久久久久久免费人妻 | 免费看欧美成人a片无码 | 国产精品日 | 十八禁啪啪无遮挡网站 | 922tv在线观看线路一 | 日本无码一区二区三区不卡免费 | 少妇做爰免费视频网站 | 少妇影院yy111111 | 午夜精品久久久久久久久久久 | 久久精品av一区二区三 | 国产精品毛片久久久久久久明星 | 免费看成年人视频 | 色不卡| 波多野久久 | 人妻无码中文专区久久五月婷 | 亚洲国产精品日韩av专区 | 熟妇人妻av无码一区二区三区 | 日本熟日本熟妇在线视频 | 中国一级簧色带免费看 | 亚洲色欲av无码成人专区 | 国产久精品 | 久久精品小视频 | 亚洲国产精品无码久久久高潮 | 国产福利永久在线视频无毒不卡 | 久草资源视频 | 亚洲天堂1 | 国产美女精品自在线拍免费 | 黄色日本免费 | 日韩欧美中文字幕在线视频 | 亚洲天堂日本 | 青草一区二区 | 99久久久无码国产精品 | 亚洲男人的天堂av | jzzjzz日本丰满成熟少妇 | 国产无遮挡18禁无码网站免费 | 亚洲最大在线观看 | 日韩aⅴ在线观看 | 亚洲成综合人在线播放 | 激情另类视频 | 国产毛1卡2卡3卡4卡网站 | 亚洲一线二线三线品牌精华液久久久 | 午夜少妇性影院私人影院 | 超碰牛牛| 国产精品色婷婷99久久精品 | 亚洲男人片片在线观看 | 国产成人精品免费视频app软件 | av中文在线播放 | 在线播放中文字幕 | 久久av嫩草影院 | 色天堂视频 | 中文天堂在线视频 | 曰韩精品无码一区二区视频 | 亚洲欧美精品无码一区二区三区 | 中文字幕在线观看二区 | 99热在线免费 | 国产亚洲欧美日韩夜色凹凸成人 | 福利微拍一区二区 | 亚洲区小说区激情区图片区 | 久久精品国产99国产精2020丨 | 四虎影视18库在线影院 | 国产奶头好大揉着好爽视频 | 国产农村妇女精品 | 黑人巨大人精品欧美三区 | 9999久久久久| 精品国产乱码久久久久久竹菊影视 | 五月天婷婷网址 | 手机在线看片日韩 |