AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

解密SpringBoot線程池

來源: 責編: 時間:2023-10-13 14:34:26 253觀看
導讀哈嘍,大家好,我是了不起。我們在日常開發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個線程池方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程池吧。使用@Async聲明多線程SpringBoot 提供

哈嘍,大家好,我是了不起。VMY28資訊網(wǎng)——每日最新資訊28at.com

我們在日常開發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個線程池方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程池吧。VMY28資訊網(wǎng)——每日最新資訊28at.com

使用@Async聲明多線程

SpringBoot 提供了注解 @Async 來使用線程池, 具體使用方法如下:VMY28資訊網(wǎng)——每日最新資訊28at.com

  1. 在啟動類(配置類)添加@EnableAsync來開啟線程池
  2. 在需要開啟子線程的方法上添加注解 @Async

下面是一個簡單的例子:VMY28資訊網(wǎng)——每日最新資訊28at.com

@Component@EnableAsync@EnableSchedulingpublic class ScheduleTask {    @Async    @Scheduled(fixedRate = 2000)    public void testAsync1() {        try {            Thread.sleep(6000);            System.out.println(LocalDateTime.now() + "--線程1:" + Thread.currentThread().getName());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    @Async    @Scheduled(cron = "*/2 * * * * ?")    public void testAsync2() {        try {            Thread.sleep(1000);            System.out.println(LocalDateTime.now() + "--線程2:" + Thread.currentThread().getName());        } catch (Exception ex) {            ex.printStackTrace();        }    }}

啟動項目,得到如下日志結果:VMY28資訊網(wǎng)——每日最新資訊28at.com

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

可以發(fā)現(xiàn)在當前環(huán)境下 task-${id} 這個 id 并不是一直增長的,而是一直在復用 1-8。這個時候可能就會有的小伙伴們會比較好奇,默認的不是 SimpleAsyncTaskExecutor 嗎?為什么從日志打印的效果上看像是一直在復用 8 個線程,難道用的是 ThreadPoolTaskExecutor?VMY28資訊網(wǎng)——每日最新資訊28at.com

原因是 SpringBoot2.1.0 版本后,新增了 TaskExecutionAutoConfiguration 配置類。其中聲明的默認線程池就是 ThreadPoolTaskExecutor 。而 @Async 在選擇執(zhí)行器的時候會先去 IOC 容器中先找是否有 TaskExecutor 的 Bean對象,所以在當前版本 SpringBoot 中,@Async 的默認 TaskExecutor 是 ThreadPoolTaskExecutor。VMY28資訊網(wǎng)——每日最新資訊28at.com

線程池配置

在 SpringBoot 項目中,我們可以在 yaml 或者 properties 配置文件中配置,或者使用 @Configuration 配置,下面演示配置方法。VMY28資訊網(wǎng)——每日最新資訊28at.com

  1. application.properties配置文件中配置
# 核心線程池數(shù)spring.task.execution.pool.core-size=5# 最大線程池數(shù)spring.task.execution.pool.max-size=10# 任務隊列的容量spring.task.execution.pool.queue-capacity=5# 非核心線程的存活時間spring.task.execution.pool.keep-alive=60# 線程池的前綴名稱spring.task.execution.thread-name-prefix=test-task-
  1. 配置類中配置
@Bean(name = "myThreadPoolTaskExecutor")public ThreadPoolTaskExecutor getMyThreadPoolTaskExecutor() {    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();    int i = Runtime.getRuntime().availableProcessors();    taskExecutor.setCorePoolSize(i * 2);    taskExecutor.setMaxPoolSize(i * 2);    taskExecutor.setQueueCapacity(i * 2 * 100);    taskExecutor.setKeepAliveSeconds(60);    taskExecutor.setThreadNamePrefix("my-task-");    taskExecutor.initialize();    return taskExecutor;}

拒絕策略

RejectedExectutionHandler 參數(shù)字段用于配置絕策略,常用拒絕策略如下VMY28資訊網(wǎng)——每日最新資訊28at.com

  • AbortPolicy:用于被拒絕任務的處理程序,它將拋出RejectedExecutionException
  • CallerRunsPolicy:用于被拒絕任務的處理程序,它直接在execute方法的調(diào)用線程中運行被拒絕的任務。
  • DiscardOldestPolicy:用于被拒絕任務的處理程序,它放棄最舊的未處理請求,然后重試execute。
  • DiscardPolicy:用于被拒絕任務的處理程序,默認情況下它將丟棄被拒絕的任務。

處理流程

  1. 查看核心線程池是否已滿,不滿就創(chuàng)建一條線程執(zhí)行任務,否則執(zhí)行第2步。
  2. 查看任務隊列是否已滿,不滿就將任務存儲在任務隊列中,否則執(zhí)行第3步。
  3. 查看線程池是否已滿,即就是是否達到最大線程池數(shù),不滿就創(chuàng)建一條線程執(zhí)行任務,否則就按照策略處理無法執(zhí)行的任務。

使用注意

  1. 注解的方法必須是 public 方法。
  2. 方法一定要從另一個類中調(diào)用,也就是從類的外部調(diào)用,類的內(nèi)部調(diào)用是無效的,因為 @Transactional 和 @Async 注解的實現(xiàn)都是基于 Spring 的 AOP ,而 AOP 的實現(xiàn)是基于動態(tài)代理模式實現(xiàn)的。那么注解失效的原因就很明顯了,有可能因為調(diào)用方法的是對象本身而不是代理對象,因為沒有經(jīng)過 Spring 容器。
  3. 異步方法使用注解 @Async 的返回值只能為 void 或者 Future。

總結

上面簡單介紹了 Spring 自帶的線程池 ThreadPoolTaskExecutor 的配置和使用,并且講了線程池的參數(shù)和處理流程。當然Spring提供了7個線程池的實現(xiàn),感興趣的可以自行了解~VMY28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13250-0.html解密SpringBoot線程池

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

上一篇: NET序列化工具:SharpSerializer庫快速上手并輕松完成序列化操作

下一篇: Tailwind CSS 真有那么好嗎?討厭它的前六大原因

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰(zhàn)略發(fā)布會今天下午如期舉辦,在本次發(fā)布會上,Redmi公布了多項關于和聯(lián)發(fā)科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 6月iOS設備好評榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現(xiàn)自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業(yè)務來說可快速實現(xiàn)自動化的上手工作。Selenium IDEKat
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • 滴滴違法違規(guī)被罰80.26億 共存在16項違法事實

    滴滴違法違規(guī)被罰80.26億 存在16項違法事實開始于2121年7月,歷經(jīng)一年時間,網(wǎng)絡安全審查辦公室對“滴滴出行”網(wǎng)絡安全審查終于有了一個暫時的結束。據(jù)“網(wǎng)信
  • Windows 11發(fā)布,微軟一改往常對老機型開放的態(tài)度

    距離 Windows 11 發(fā)布已經(jīng)過去一周,在過去一周里,很多數(shù)碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
Top