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

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

解密SpringBoot線程池

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

哈嘍,大家好,我是了不起。7wl28資訊網——每日最新資訊28at.com

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

使用@Async聲明多線程

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

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

下面是一個簡單的例子:7wl28資訊網——每日最新資訊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();        }    }}

啟動項目,得到如下日志結果:7wl28資訊網——每日最新資訊28at.com

圖片圖片7wl28資訊網——每日最新資訊28at.com

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

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

線程池配置

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

  1. application.properties配置文件中配置
# 核心線程池數spring.task.execution.pool.core-size=5# 最大線程池數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 參數字段用于配置絕策略,常用拒絕策略如下7wl28資訊網——每日最新資訊28at.com

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

處理流程

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

使用注意

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein“利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 江山市| 东山县| 临清市| 小金县| 鹤岗市| 铜鼓县| 南漳县| 海南省| 车险| 滨海县| 东城区| 吴旗县| 镇沅| 聂拉木县| 利津县| 阿图什市| 东乡县| 左贡县| 曲靖市| 东丽区| 米脂县| 绥阳县| 酒泉市| 余庆县| 晴隆县| 揭阳市| 长沙县| 浦东新区| 花莲县| 托克托县| 麻城市| 隆尧县| 江津市| 丹寨县| 漳浦县| 汝南县| 讷河市| 克什克腾旗| 沛县| 沧州市| 遵义县|