日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SpringBoot中的異步多線程使用及避坑指南

來源: 責編: 時間:2024-03-28 17:49:57 214觀看
導讀在現(xiàn)代的Web應用開發(fā)中,處理請求時需要考慮到系統(tǒng)的性能和響應速度。特別是在處理大量請求或者需要進行耗時操作時,采用異步多線程處理是一種常見的解決方案。Spring Boot提供了@Async注解來支持異步方法調(diào)用,結合合適的

在現(xiàn)代的Web應用開發(fā)中,處理請求時需要考慮到系統(tǒng)的性能和響應速度。特別是在處理大量請求或者需要進行耗時操作時,采用異步多線程處理是一種常見的解決方案。Spring Boot提供了@Async注解來支持異步方法調(diào)用,結合合適的線程池配置,可以很容易地實現(xiàn)異步多線程處理,提升系統(tǒng)的并發(fā)能力和性能。cSd28資訊網(wǎng)——每日最新資訊28at.com

今日內(nèi)容介紹,大約花費9分鐘cSd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cSd28資訊網(wǎng)——每日最新資訊28at.com

1.配置線程池

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

cSd28資訊網(wǎng)——每日最新資訊28at.com

在這個配置中,我們使用了ThreadPoolTaskExecutor作為線程池的實現(xiàn),并且設置了一些關鍵參數(shù),如核心線程數(shù)、最大線程數(shù)、緩沖隊列大小等。如果不太了解線程池的小伙伴可以看一下之前介紹線程池介紹線程池的核心參數(shù),線程池的執(zhí)行原理知道cSd28資訊網(wǎng)——每日最新資訊28at.com

2. @Async注解

在需要異步執(zhí)行的方法上使用@Async注解。這樣的方法將會在一個單獨的線程中執(zhí)行,而不會阻塞主線程。cSd28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@Servicepublic class AsyncService {   // 指定使用beanname為doSomethingExecutor的線程池    @Async("doSomethingExecutor")    public  CompletableFuture<String> doSomething(String message) throws InterruptedException {        log.info("doSomethingExecutor thread name  ={}", Thread.currentThread().getName());        Thread.sleep(1000);        return CompletableFuture.completedFuture(message);    }}

doSomething()方法被標記為異步方法,并且指定了使用名為"doSomethingExecutor"的線程池進行執(zhí)行。cSd28資訊網(wǎng)——每日最新資訊28at.com

3. 異步多結果聚合返回CompletableFuture

在某些情況下,我們可能需要等待多個異步任務執(zhí)行完畢后再進行下一步操作,這時可以使用CompletableFuture來實現(xiàn)異步多結果的聚合。cSd28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMappingpublic class AsyncController {    @Autowired    private AsyncService asyncService;    @GetMapping("/open/somethings")    public List<String> somethings() throws InterruptedException {        int count = 6;        List<CompletableFuture<String>> futures = new ArrayList<>();        List<String> results = new ArrayList<>();        // 啟動多個異步任務,并將 CompletableFuture 對象存儲在列表中        for (int i = 1; i < count; i++) {            CompletableFuture<String> future = asyncService.doSomething("index: "+i);            futures.add(future);        }                for (CompletableFuture<String> future : futures) {            String result = future.get(); // 阻塞等待異步任務完成并獲取結果            results.add(result);        }        return results;    }}

我們通過循環(huán)啟動了多個異步任務,將返回的 CompletableFuture 對象存儲在列表中。然后,我們再次循環(huán)遍歷這些 CompletableFuture 對象,并調(diào)用 get() 方法來阻塞等待異步任務完成,獲取結果。最后,將結果添加到結果列表中并返回cSd28資訊網(wǎng)——每日最新資訊28at.com

4. 測試

使用瀏覽器發(fā)送http://localhost:8888/open/somethings,結果如下cSd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cSd28資訊網(wǎng)——每日最新資訊28at.com

發(fā)現(xiàn)使用多個線程執(zhí)行方法cSd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cSd28資訊網(wǎng)——每日最新資訊28at.com

5.注意事項

@Async注解會在以下幾個場景失效,使用了@Async注解,但就沒有走多線程:cSd28資訊網(wǎng)——每日最新資訊28at.com

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

異步方法使用注解@Async的返回值只能為void或者Future及其子類,當返回結果為其他類型時,方法還是會異步執(zhí)行,但是返回值都是nullcSd28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-80194-0.htmlSpringBoot中的異步多線程使用及避坑指南

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: vivo 消息中間件測試環(huán)境項目多版本實踐

下一篇: AI時代的技術棧,你了解幾分?

標簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時代已經(jīng)過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 消息稱迪士尼要拍真人版《魔發(fā)奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實有點忙,忙著將不少動畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發(fā)奇緣》也在路上了。據(jù)外媒消息稱,迪士尼將打造真人版
  • 0糖0卡0脂 旭日森林仙草烏龍茶優(yōu)惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優(yōu)惠券,到手價為29.9元。產(chǎn)品規(guī)格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創(chuàng)建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態(tài)工廠方法模式,不屬于GoF 23種設計
  • 如何通過Python線程池實現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機制,它可以在程序啟動時創(chuàng)建一組線程,并將它們置于等待任務的狀態(tài)。當任務到達時,線程池中的某個線程會被喚醒并執(zhí)行任務,執(zhí)行完任
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(jīng)(niudaocaijing)7月5日,企鵝FM發(fā)布官方公告稱由于業(yè)務調(diào)整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業(yè)務走向消亡。騰訊在長音頻領域還在摸索。為
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top 主站蜘蛛池模板: 休宁县| 蕲春县| 峨眉山市| 贞丰县| 新和县| 台北县| 吉林市| 鹤山市| 陆川县| 舒兰市| 云林县| 尤溪县| 华容县| 伽师县| 罗甸县| 利津县| 宣化县| 赤壁市| 绥中县| 彰化市| 富宁县| 乐都县| 涡阳县| 西吉县| 休宁县| 遂平县| 乐安县| 方山县| 固始县| 桃园市| 响水县| 沂水县| 南京市| 岳西县| 金堂县| 大理市| 大厂| 龙川县| 西贡区| 江孜县| 米易县|