国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

線程池的使用場景和工作原理

開發 前端
線程和進程進程就像是你打開的360安全衛士這個軟件本身。線程:在這個空間里,360安全衛士可以運行它的各種功能,比如病毒掃描、垃圾清理等都是一個線程在處理。

?近期工作中遇到線程池參數配置不當引發的相關問題。基于此,本文主要結合線程池的原理、使用場景、參數配置、使用注意事項等詳細闡述。文章較長,預計閱讀時長8~10分鐘,建議收藏。

圖片圖片

前置知識

  • 池化技術一種資源管理策略,旨在提高資源利用率和系統性能,減少資源創建和銷毀的開銷。如數據庫連接池、線程池、常量池等。
  • 線程和進程進程就像是你打開的360安全衛士這個軟件本身。線程:在這個空間里,360安全衛士可以運行它的各種功能,比如病毒掃描、垃圾清理等都是一個線程在處理。
  • 多線程在計算機中,CPU(中央處理器)是執行線程的地方。在多核CPU的系統中,每個核心可以獨立執行線程。即多個線程可以真正地同時運行。

簡單了解幾個關鍵詞,我們說說什么是線程池?

1.什么是線程池?

線程池是一種線程管理和復用的機制。

其核心思想是:預先創建一定數量的線程,并把它們保存在線程池中,用的時候拿出來,用完了丟進去。而不是每次有任務過來重新創建新的線程。如下圖,其核心組成:

  • 工作線程(Worker):這些是線程池中實際執行任務的線程。
  • 任務隊列(Task Queue):這是一個存放待執行任務的隊列,工作線程會從這個隊列中取出任務來執行。
  • 線程管理器(Thread Manager):負責管理線程的生命周期,包括創建新線程、監控線程狀態以及銷毀不再需要的線程。
  • 線程工廠(Thread Factory):用于創建新線程的組件,可以定制線程的名稱、優先級等屬性。
  • 拒絕策略(Rejection Policy):當任務隊列滿了,且工作線程都在忙碌時,新提交的任務將被拒絕,拒絕策略定義了如何處理這些被拒絕的任務。
  • 調度器(Scheduler):雖然不是所有線程池都有,但有些線程池會包含調度器,用于安排任務在特定時間執行。

架構圖

圖片圖片

2.線程池有什么好處?

線程池的優勢總結為以下幾點:

  • 減少資源消耗:

線程池通過預先創建線程并復用它們,減少了頻繁創建和銷毀線程所帶來的系統資源消耗。

  • 提高系統性能:

通過合理配置線程池大小,可以最大限度地壓榨多核CPU的性能,從而提高機器的處理能力。

  • 提高響應速度:

線程池中的線程是預先創建的,這意味著當新任務到達時,可以立即被處理,而不需要等待線程的創建,這樣可以顯著提高任務的響應速度。

  • 增強并發性能:

線程池支持多線程并發執行任務,這樣可以同時處理多個任務,增強系統的并發處理能力。

線程池有哪些使用場景?

線程池是一種多線程管理工具,它提供了線程的復用和調度功能,可以顯著提高程序的并發性能和資源利用率。以下是線程池的一些常見使用場景:

  1. 文件上傳下載

如:導入、導出功能、文件批數據處理等。

  1. 異步任務處理

如發送郵件、日志記錄等.

  1. 定時任務

如定時備份、定時清理緩存等,日文件、月文件數據同步等

  1. 批處理

如數據分析、統計報表生成等。

  1. 快速響應用戶請求

如用戶查詢商品詳情頁,可以考慮使用線程池并發地查詢價格、優惠、庫存等信息,再聚合結果返回,降低接口總響應時間。

線程池是如何工作的?

曾經有面試官這樣問:核心線程數10,最大線程數20,阻塞隊列最大100,假如我有100個線程同時進來,線程處理任務時間平均按1s計算,那理想情況下多長時間可以處理完?

基于上邊的問題,線程池的工作原理可以概括為以下幾個步驟:

  • 工作原理(簡易版)

圖片圖片

  • 任務提交:

開發人員使用 ThreadPoolExecutor 的 submit() 方法提交需要執行的任務。這些任務通常是實現了 Callable 或 Runnable 接口的對象。

  • 狀態檢查:

線程池會檢查自身的運行狀態。如果線程池不是處于 RUNNING 狀態,那么會直接拒絕新提交的任務。

  • 任務封裝:

被提交的任務會被封裝成一個 FutureTask 對象。FutureTask 實現了 Future 接口,用來獲取任務的執行結果。

  • 核心線程處理:

如果線程池的核心線程數小于 corePoolSize,線程池會嘗試創建一個新的核心線程來執行這個任務。

  • 任務隊列處理:

如果核心線程數已經達到 corePoolSize,則任務會被放入一個任務隊列中,等待工作線程從隊列中取出并執行。

  • 非核心線程處理:

如果任務隊列已滿,并且當前線程池中的線程數量小于 maximumPoolSize,則線程池會嘗試創建新的非核心線程來執行任務。

  • 拒絕策略處理:

如果線程池中的線程數量已經達到 maximumPoolSize,并且任務隊列也已滿,線程池將根據設定的拒絕策略來處理新提交的任務。

  • 任務執行與結果獲取:

任務執行完成后,線程池會返回一個 Future 對象。通過這個 Future 對象,可以查詢任務是否完成,以及獲取任務的執行結果。

??總之,歸納起來的執行流程:

圖片圖片

線程池參數如何設置?

《阿里巴巴Java開發手冊》中規約中強調:

圖片圖片

因此實際工作中,我們通常自定義線程池。其核心參數:

public ThreadPoolExecutor(
      int corePoolSize,            // 核心線程數,線程池中始終保持的線程數,即使它們處于空閑狀態
      int maximumPoolSize,          // 最大線程數,線程池中允許的最大線程數
      long keepAliveTime,           // 非核心線程空閑存活時間,當線程池中正在運行的線程數量超過了核心線程數時,多余的線程在空閑時間達到這個值后會被終止
      TimeUnit unit,                // 存活時間單位,與keepAliveTime一起使用,表示keepAliveTime的時間單位
      BlockingQueue<Runnable> workQueue, // 工作隊列,用于存放待執行任務的阻塞隊列
      ThreadFactory threadFactory,  // 線程工廠,用于創建新線程
      RejectedExecutionHandler handler // 拒絕策略,當任務太多,無法被線程池及時處理時,采取的策略
  )

參數最佳實踐:

實際上,大都數公司的線程池配置依照自身業務場景和機器性能配置的。這里介紹的只是個參考,能說清楚利弊就好

  1. corePoolSize,  // 核心線程數
  • CPU密集型可以將線程數設置為 N(CPU 核數)+1,比 CPU 核心數多出來的一個線程是為了防止線程偶發的缺頁中斷。
  • IO密集型系統會用大部分的時間來處理 I/O 交互,而線程在處理 I/O 的時間段內不會占用 CPU 來處理,這時就可以將 CPU 交出給其它線程使用。因此在 I/O 密集型任務的應用中,我們可以多配置一些線程,具體的計算方法可以是 :核心線程數=CPU核數*2。


如何理解 CPU 密集 和I/O密集?

CPU密集型任務通常在CPU上執行進行大量計算(如RSA加密)I/O密集多指I/O操作(主要磁盤讀寫,如 數據庫操作等)


附加:如何獲取CPU核數?

代碼:

Runtime.getRuntime().availableProcessors();

命令:

$ lscpu
  1. maximumPoolSize          // 最大線程數

具體依據服務器的I/O性能,經驗法則:

對于I/O密集型應用,通常將 maximumPoolSize 設置為可用處理器核心數的5到10倍。

文件處理服務:如果服務需要處理大量的文件上傳和下載,maximumPoolSize 可以設置為20或更多。

  1. keepAliveTime          // 非核心線程空閑存活時間

看業務實時性高不高,一般系統,設置60s亦可

  1. unit          // 存活時間單位

看業務實時性高不高,一般系統,設置s亦可

  1. workQueue          // 工作隊列

按目前經驗,工作中常用:

LinkedBlockingQueue 是一個無界隊列,適用于任務數量可能突然激增的場景;

ArrayBlockingQueue 是一個有界隊列,適用于需要限制最大任務數量的場景,以避免資源耗盡

  1. threadFactory          // 線程工廠一般使用默認的也可
  2. handler // 拒絕策略

主要有4種拒絕策略:

AbortPolicy:直接丟棄任務,拋出異常,這是默認策略

CallerRunsPolicy:只用調用者所在的線程來處理任務

DiscardOldestPolicy:丟棄等待隊列中最舊的任務,并執行當前任務

DiscardPolicy:直接丟棄任務,也不拋出異常

介于此,給出公司中用到的其中一個案例配置,僅供參考。

@Bean("XXXAsyncPool")
   public Executor myTaskAsyncPool() {
       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
       //配置核心線程數
       executor.setCorePoolSize(10);
       //配置核心線程數
       executor.setMaxPoolSize(20);
       //配置隊列容量
       executor.setQueueCapacity(1000);
       //設置線程活躍時間
       executor.setKeepAliveSeconds(60);
       //設置線程名
       executor.setThreadNamePrefix("XXXAsyncPool-");
       //設置拒絕策略
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
      
       executor.initialize();
       return executor;
   }

拒絕策略先前遇到坑,

篇幅,稍后單獨做個介紹。

參考資料

責任編輯:武曉燕 來源: 碼易有道
相關推薦

2021-06-06 23:40:53

線程池使用場景

2025-04-27 08:30:48

2019-10-25 10:35:49

Java用法場景

2021-03-04 09:00:00

架構Lambda工具

2021-07-16 11:35:20

Java線程池代碼

2022-05-06 13:30:56

TDD場景代碼

2018-05-16 15:26:43

數據庫MySQL主從復制

2021-08-29 22:05:04

對象自動回收

2010-12-21 14:21:36

線程C#

2024-03-11 18:18:58

項目Spring線程池

2018-05-22 09:47:07

2023-05-16 07:47:18

RabbitMQ消息隊列系統

2018-09-19 14:53:02

NIOBIO運行

2024-04-11 13:41:47

2025-07-17 07:26:47

2024-12-30 08:29:05

2021-09-11 15:26:23

Java多線程線程池

2024-07-15 08:20:24

2024-11-11 14:55:48

2020-02-14 13:50:32

JavaScript前端技術
點贊
收藏

51CTO技術棧公眾號

亚洲一级一区| 卡一卡二国产精品| 精东影业在线观看| 成人午夜两性视频| 欧美精品亚洲二区| 成人av综合在线| 成人看的视频| 97在线超碰| 久草香蕉在线| 欧美污视频久久久| 欧美福利视频在线| 欧美日韩一区二区不卡| 成人毛片视频在线观看| 精品日韩毛片| 欧美hdxxxx| 永久免费的av网站| 欧美一区二区三区电影在线观看| 欧美另类高清videos| 欧美视频一区二区三区在线观看| 成人免费福利片| 亚洲欧洲日韩| 国产91在线播放精品| 性欧美精品孕妇| 精品人妻大屁股白浆无码| 国产精品久久久久久久久久免费| 日本中文字幕一区二区有限公司| 99视频一区| 伊人久久大香线蕉av不卡| 伊人久久视频| av在线天堂| 超碰在线免费公开| 三上悠亚国产精品一区二区三区| 春暖花开亚洲一区二区三区| 国产精品一区二区精品视频观看| 久久婷婷蜜乳一本欲蜜臀| 亚洲一区图片| 欧美日韩另类在线| 国产精品视频一区二区三区| 国产美女性感在线观看懂色av | jizz在亚洲| 欧美日韩亚洲一区二区三区在线观看| 欧美另类暴力丝袜| 精品福利一区二区三区 | 国产精品自拍网| 中日韩美女免费视频网址在线观看| 91久久免费观看| 国产精品亲子乱子伦xxxx裸| 美国三级日本三级久久99| 成人一区二区| 看亚洲a级一级毛片| 国内激情视频在线观看| 欧美精品a∨在线观看不卡| 一本色道久久亚洲综合精品蜜桃 | 性欧美猛交videos| 伊人资源视频在线| eeuss影院一区二区三区| 日韩亚洲欧美在线观看| 成人欧美一区二区三区视频| 欧美精品久久久久久久自慰| jyzzz在线观看视频| 欧美亚洲tv| 久久综合999| 色综合导航网站| 日韩在线精品强乱中文字幕| xxxx成人| 黄a在线观看| 涩涩视频在线观看免费| 天堂中文字幕一二区| 免费成人午夜视频| 欧美三级网色| 国产精品久久久久久免费观看 | 亚洲国产成人va在线观看麻豆| 香蕉久久国产| 国产精品网站入口| 9色在线视频| 美女诱惑一区| 亚洲国产日韩欧美在线图片| 久久免费高清| 99精品在线| 麻豆成人入口| 久久久久黄色| 男人久久天堂| 在线网址91| av基地在线| 天堂a中文在线| 一级特黄视频| 1024欧美极品| 美女黄色片视频| 久久久久久高清| 精品国产一区二区三区久久久蜜臀 | 懂色av中文字幕一区二区三区| 亚洲理论在线| 欧美激情91| 久久久久久久久久久妇女| 性欧美lx╳lx╳| 亚洲精品ww久久久久久p站| 91美女片黄在线观看91美女| 丁香一区二区三区| 国产传媒日韩欧美成人| 奇米影视7777精品一区二区| 麻豆亚洲精品| 天堂一区二区在线| 久久久天天操| 青青草伊人久久| 蜜乳av一区二区| 寂寞少妇一区二区三区| 狠狠色丁香婷综合久久| 国产美女精品一区二区三区| 国产精品一区在线| 成人精品视频.| 91麻豆精品一区二区三区| 久久久噜噜噜久久中文字幕色伊伊 | 欧美色爱综合网| 欧美怡红院视频| 欧美精品九九99久久| 7777女厕盗摄久久久| 欧美一区二区三区啪啪| 69久久99精品久久久久婷婷| 日韩一级片网站| 亚洲国产精品久久久| 精品久久免费看| 亚洲人成免费电影| 日韩在线视频一区| 欧美极品第一页| 91av视频在线| 国产精品一区二区性色av| 91久久久久久国产精品| 国产传媒欧美日韩| 日韩一二三区不卡在线视频| 三上悠亚免费在线观看| 18禁免费无码无遮挡不卡网站| 国产一区亚洲二区三区| 加勒比在线日本| 亚洲校园欧美国产另类| 黄色精品免费看| 成人性生交大片免费网站 | 91成人免费视频| 丰乳肥臀在线| 欧美性高潮在线| av无码精品一区二区三区| 一区二区三区成人精品| 成人日韩在线电影| 黄色在线免费| 亚洲成年人影院在线| 在线精品福利| 日本国产在线播放| 精品视频色一区| 三上悠亚国产精品一区二区三区| 97碰碰碰免费色视频| 欧美日本三区| 91黄色在线看| 亚洲欧美色一区| 极品视频在线| 欧美日韩第一页| 电影网一区二区| 欧美在线播放高清精品| 国产精品粉嫩av| 国产免费久久精品| 国产在线无码精品| 亚洲一区国产| 久久精品国产理论片免费| 国产欧美日韩精品一区二区三区 | 男男激情在线| 国产午夜精品在线观看| 视频一区亚洲| 蜜臀av亚洲一区中文字幕| 精品一区二区久久久久久久网站| 久久精品久久精品| 国产精品久久久久久久久久直播| 亚洲午夜黄色| 国产精品久久亚洲| 日本欧美肥老太交大片| 中文字幕亚洲欧美| 国产一区一一区高清不卡| 精品久久久久久久久久ntr影视| 鲁丝一区二区三区免费| 中文av一区| 男女羞羞网站| 爽爽爽爽爽爽爽成人免费观看| 久久亚洲春色中文字幕久久久| 欧美va在线观看| 男人插曲女人视频免费| 97高清免费视频| 一级毛片精品毛片| 少妇特黄a一区二区三区| 国产99久久久久| 1024视频在线| 日韩欧美国产高清91| 国产精品伦理| 欧美日韩国产在线播放网站| 中文字幕免费在线视频| 亚洲国产小视频在线观看| 国产在线播放一区二区三区| 91精品丝袜国产高跟在线| 在线国产一级| av一区二区三区四区电影| 在线观看日韩av电影| 成人午夜视频免费观看| 欧美性猛交xxxxx免费看| gogo久久|