最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java線程池合理設置最大線程數和核心線程數方式

 更新時間:2021年12月28日 15:59:26   作者:李振偉  
這篇文章主要介紹了java線程池合理設置最大線程數和核心線程數方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

線程池合理設置最大線程數和核心線程數

工作中有這樣一個場景,需要處理千萬級別的數據的一個算法,大部分是增刪查的操作。這個時候就需要使用多線程去處理。

一開始是這么配置的

@Configuration
@EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解開啟異步任務支持
@ComponentScan({"com.ctfojt.auditbcarslogo.service"}) //必須加此注解掃描包
public class ThreadPoolConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(10);//核心線程大小
        taskExecutor.setMaxPoolSize(20);//最大線程大小
        taskExecutor.setQueueCapacity(500);//隊列最大容量
        //當提交的任務個數大于QueueCapacity,就需要設置該參數,但spring提供的都不太滿足業(yè)務場景,可以自定義一個,也可以注意不要超過QueueCapacity即可
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(10);
        taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");
        taskExecutor.initialize();
        return taskExecutor;
    }
}

這樣配置效率很低,一天大概能處理30多萬的數據。往后隨著插入表的數據越來越多,處理速度也隨之降低,跑個一兩天之后,差不多能夠處理10萬多。完全滿足不了需求。

后來網上查詢線程池核心數配置

大部分都是這樣的:

注:IO密集型(某大廠實踐經驗) 核心線程數 = CPU核數 / (1-阻塞系數)或著 CPU密集型:核心線程數 = CPU核數 + 1 IO密集型:核心線程數 = CPU核數 * 2

也嘗試著這么配置,結果發(fā)現(xiàn)效率并不理想,提高不了多少。

最后我是這么配置的

結果效率大大提升,僅用不到一天的數據,就跑完了千萬級的數據。

//獲取當前機器的核數
public static final int cpuNum = Runtime.getRuntime().availableProcessors();
@Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(cpuNum);//核心線程大小
        taskExecutor.setMaxPoolSize(cpuNum * 2);//最大線程大小
        taskExecutor.setQueueCapacity(500);//隊列最大容量
        //當提交的任務個數大于QueueCapacity,就需要設置該參數,但spring提供的都不太滿足業(yè)務場景,可以自定義一個,也可以注意不要超過QueueCapacity即可
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");
        taskExecutor.initialize();
        return taskExecutor;
    }

完美的解決了問題!

線程池核心線程數與最大線程數的區(qū)別

線程池策略

corePoolSize:核心線程數;maximunPoolSize:最大線程數

每當有新的任務到線程池時,

  • 第一步:先判斷線程池中當前線程數量是否達到了corePoolSize,若未達到,則新建線程運行此任務,且任務結束后將該線程保留在線程池中,不做銷毀處理,若當前線程數量已達到corePoolSize,則進入下一步;
  • 第二步:判斷工作隊列(workQueue)是否已滿,未滿則將新的任務提交到工作隊列中,滿了則進入下一步;
  • 第三步:判斷線程池中的線程數量是否達到了maxumunPoolSize,如果未達到,則新建一個工作線程來執(zhí)行這個任務,如果達到了則使用飽和策略來處理這個任務。注意: 在線程池中的線程數量超過corePoolSize時,每當有線程的空閑時間超過了keepAliveTime,這個線程就會被終止。直到線程池中線程的數量不大于corePoolSize為止。

(由第三步可知,在一般情況下,Java線程池中會長期保持corePoolSize個線程。)

飽和策略

當工作隊列滿且線程個數達到maximunPoolSize后所采取的策略

  • AbortPolicy:默認策略;新任務提交時直接拋出未檢查的異常RejectedExecutionException,該異??捎烧{用者捕獲。
  • CallerRunsPolicy:既不拋棄任務也不拋出異常,使用調用者所在線程運行新的任務。
  • DiscardPolicy:丟棄新的任務,且不拋出異常。
  • DiscardOldestPolicy:調用poll方法丟棄工作隊列隊頭的任務,然后嘗試提交新任務
  • 自定義策略:根據用戶需要定制。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Mybatis中一對多(collection)和一對一(association)的組合查詢使用

    Mybatis中一對多(collection)和一對一(association)的組合查詢使用

    這篇文章主要介紹了Mybatis中一對多(collection)和一對一(association)的組合查詢使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解讀@ResponseBody與@RequestBody注解的用法

    解讀@ResponseBody與@RequestBody注解的用法

    這篇文章主要介紹了Spring MVC中的@ResponseBody和@RequestBody注解的用法,@ResponseBody注解用于將Controller方法的返回對象轉換為指定格式(如JSON)并通過Response響應給客戶端,@RequestBody注解用于讀取HTTP請求的內容
    2024-11-11
  • Java實現(xiàn)圖片驗證碼功能

    Java實現(xiàn)圖片驗證碼功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)圖片驗證碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • MyBatis在SQL語句中如何獲取list的大小

    MyBatis在SQL語句中如何獲取list的大小

    這篇文章主要介紹了MyBatis在SQL語句中如何獲取list的大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring中Feign的調用流程詳解

    Spring中Feign的調用流程詳解

    這篇文章主要介紹了Spring中Feign的調用流程詳解,分析過了創(chuàng)建的代理是FeignInvocationHandler,那我們就打斷點,停在它的反射方法上,看看到底做了什么,需要的朋友可以參考下
    2023-11-11
  • java后臺本地文件轉為MultipartFile類型的實現(xiàn)方式

    java后臺本地文件轉為MultipartFile類型的實現(xiàn)方式

    在Java后臺將本地文件轉換為MultipartFile類型,可以通過使用FileItemFactory創(chuàng)建FileItem,然后使用CommonsMultipartFile類構造一個MultipartFile對象,將本地文件流轉換為MultipartFile,getMultipartFiles()和getMultipartFiles()方法
    2025-02-02
  • 基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    下面小編就為大家?guī)硪黄贘ava class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java中的自動裝箱與自動拆箱的實現(xiàn)

    Java中的自動裝箱與自動拆箱的實現(xiàn)

    自動裝箱和自動拆箱使得我們在使用基本數據類型時更加方便,同時也提高了代碼的可讀性和健壯性,本文將詳細介紹Java中的自動裝箱和自動拆箱機制,感興趣的可以了解一下
    2023-08-08
  • SpringBoot整合aop面向切面編程過程解析

    SpringBoot整合aop面向切面編程過程解析

    這篇文章主要介紹了SpringBoot整合aop面向切面編程過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java中各類日期和時間轉換超詳析總結(Date和LocalDateTime相互轉換等)

    Java中各類日期和時間轉換超詳析總結(Date和LocalDateTime相互轉換等)

    這篇文章主要介紹了Java中日期和時間處理的幾個階段,包括java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar和java.util.GregorianCalendar等類,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01

最新評論

崇阳县| 定兴县| 彭州市| 秦皇岛市| 丹阳市| 台安县| 汶上县| 平潭县| 新郑市| 临洮县| 鹤庆县| 屏南县| 南陵县| 博兴县| 平果县| 西华县| 江津市| 始兴县| 宜春市| 商城县| 嘉荫县| 遂川县| 肃北| 海口市| 喀什市| 临夏县| 彭水| 郎溪县| 来凤县| 曲阳县| 桦甸市| 泉州市| 丰城市| 贺兰县| 鲁甸县| 彰化市| 金山区| 忻州市| 缙云县| 芜湖市| 梧州市|