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

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

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

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

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

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

圖片圖片49428資訊網(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;    }}

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

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

2. @Async注解

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

3. 異步多結(jié)果聚合返回CompletableFuture

在某些情況下,我們可能需要等待多個異步任務執(zhí)行完畢后再進行下一步操作,這時可以使用CompletableFuture來實現(xiàn)異步多結(jié)果的聚合。49428資訊網(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(); // 阻塞等待異步任務完成并獲取結(jié)果            results.add(result);        }        return results;    }}

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

4. 測試

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

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

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

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

5.注意事項

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

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

異步方法使用注解@Async的返回值只能為void或者Future及其子類,當返回結(jié)果為其他類型時,方法還是會異步執(zhí)行,但是返回值都是null49428資訊網(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時代的技術棧,你了解幾分?

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場演示顯示,華為的實況窗可以更高效的展現(xiàn)出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 自動化在DevOps中的力量:簡化軟件開發(fā)和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現(xiàn)以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發(fā)生命周期中實現(xiàn)更
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經(jīng)針對開發(fā)者公布了HarmonyOS4.0,以便于開發(fā)者提前進行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現(xiàn)場,成為了展會的一大看點。這也是三翼鳥繼9月9日發(fā)布了行業(yè)首個一站式定制智慧家平臺后的
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發(fā)表演講

    11月18日,記者從2022中關村論壇新聞發(fā)布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發(fā)展改革委、工業(yè)和信息化部、國務
Top 主站蜘蛛池模板: 孝昌县| 大同市| 曲沃县| 遵义县| 宁夏| 屯门区| 柯坪县| 增城市| 囊谦县| 乌拉特中旗| 安岳县| 日照市| 桦川县| 唐山市| 扬州市| 阳高县| 阳西县| 苗栗县| 衡山县| 万年县| 宁津县| 大姚县| 荔浦县| 全州县| 漳浦县| 乐山市| 隆德县| 武宁县| 佛坪县| 丹江口市| 汕尾市| 门头沟区| 潜江市| 资兴市| 余姚市| 鹿泉市| 湘乡市| 临清市| 弥勒县| 随州市| 南岸区|