成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

圖片圖片

前置知識

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

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

1.什么是線程池?

線程池是一種線程管理和復(fù)用的機制。

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

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

架構(gòu)圖

圖片圖片

2.線程池有什么好處?

線程池的優(yōu)勢總結(jié)為以下幾點:

  • 減少資源消耗:

線程池通過預(yù)先創(chuàng)建線程并復(fù)用它們,減少了頻繁創(chuàng)建和銷毀線程所帶來的系統(tǒng)資源消耗。

  • 提高系統(tǒng)性能:

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

  • 提高響應(yīng)速度:

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

  • 增強并發(fā)性能:

線程池支持多線程并發(fā)執(zhí)行任務(wù),這樣可以同時處理多個任務(wù),增強系統(tǒng)的并發(fā)處理能力。

線程池有哪些使用場景?

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

  1. 文件上傳下載

如:導(dǎo)入、導(dǎo)出功能、文件批數(shù)據(jù)處理等。

  1. 異步任務(wù)處理

如發(fā)送郵件、日志記錄等.

  1. 定時任務(wù)

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

  1. 批處理

如數(shù)據(jù)分析、統(tǒng)計報表生成等。

  1. 快速響應(yīng)用戶請求

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

線程池是如何工作的?

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

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

  • 工作原理(簡易版)

圖片圖片

  • 任務(wù)提交:

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

  • 狀態(tài)檢查:

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

  • 任務(wù)封裝:

被提交的任務(wù)會被封裝成一個 FutureTask 對象。FutureTask 實現(xiàn)了 Future 接口,用來獲取任務(wù)的執(zhí)行結(jié)果。

  • 核心線程處理:

如果線程池的核心線程數(shù)小于 corePoolSize,線程池會嘗試創(chuàng)建一個新的核心線程來執(zhí)行這個任務(wù)。

  • 任務(wù)隊列處理:

如果核心線程數(shù)已經(jīng)達到 corePoolSize,則任務(wù)會被放入一個任務(wù)隊列中,等待工作線程從隊列中取出并執(zhí)行。

  • 非核心線程處理:

如果任務(wù)隊列已滿,并且當前線程池中的線程數(shù)量小于 maximumPoolSize,則線程池會嘗試創(chuàng)建新的非核心線程來執(zhí)行任務(wù)。

  • 拒絕策略處理:

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

  • 任務(wù)執(zhí)行與結(jié)果獲取:

任務(wù)執(zhí)行完成后,線程池會返回一個 Future 對象。通過這個 Future 對象,可以查詢?nèi)蝿?wù)是否完成,以及獲取任務(wù)的執(zhí)行結(jié)果。

??總之,歸納起來的執(zhí)行流程:

圖片圖片

線程池參數(shù)如何設(shè)置?

《阿里巴巴Java開發(fā)手冊》中規(guī)約中強調(diào):

圖片圖片

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

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

參數(shù)最佳實踐:

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

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


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

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


附加:如何獲取CPU核數(shù)?

代碼:

Runtime.getRuntime().availableProcessors();

命令:

$ lscpu
  1. maximumPoolSize          // 最大線程數(shù)

具體依據(jù)服務(wù)器的I/O性能,經(jīng)驗法則:

對于I/O密集型應(yīng)用,通常將 maximumPoolSize 設(shè)置為可用處理器核心數(shù)的5到10倍。

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

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

看業(yè)務(wù)實時性高不高,一般系統(tǒng),設(shè)置60s亦可

  1. unit          // 存活時間單位

看業(yè)務(wù)實時性高不高,一般系統(tǒng),設(shè)置s亦可

  1. workQueue          // 工作隊列

按目前經(jīng)驗,工作中常用:

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

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

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

主要有4種拒絕策略:

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

CallerRunsPolicy:只用調(diào)用者所在的線程來處理任務(wù)

DiscardOldestPolicy:丟棄等待隊列中最舊的任務(wù),并執(zhí)行當前任務(wù)

DiscardPolicy:直接丟棄任務(wù),也不拋出異常

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

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

拒絕策略先前遇到坑,

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

參考資料

責(zé)任編輯:武曉燕 來源: 碼易有道
相關(guān)推薦

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

架構(gòu)Lambda工具

2022-05-06 13:30:56

TDD場景代碼

2021-07-16 11:35:20

Java線程池代碼

2018-05-16 15:26:43

數(shù)據(jù)庫MySQL主從復(fù)制

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消息隊列系統(tǒng)

2018-09-19 14:53:02

NIOBIO運行

2024-04-11 13:41: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前端技術(shù)

2020-10-29 07:16:26

布隆過濾器場景
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久草成人 | 国产在线二区 | 91精品国产92 | 亚洲狠狠 | 天堂久久天堂综合色 | 欧美伊人 | 国产综合久久 | 欧美日韩精品久久久免费观看 | 欧美一级片在线看 | 日韩精品1区2区3区 成人黄页在线观看 | 亚洲一区二区中文字幕 | 国产一区高清 | 午夜影院在线免费观看视频 | 一区二区三区视频在线免费观看 | 国产精品成人在线 | 色婷婷在线视频 | 天天操 天天操 | 亚洲欧美日韩网站 | 亚洲乱码一区二区三区在线观看 | 午夜免费福利电影 | 五月婷婷丁香 | 欧美久久天堂 | 在线播放日韩 | 天堂av在线影院 | 亚洲图片视频一区 | 午夜电影福利 | 国产日韩一区二区三区 | 黄色在线免费观看 | 婷婷色婷婷 | 欧美亚洲国产日韩 | 99精品免费 | 超碰最新在线 | 亚洲视频在线观看 | 91精品一区二区 | 国产婷婷综合 | 午夜免费电影 | av大片在线| 欧美1区 | 四虎影院在线免费观看 | 亚洲视频二 | 成人精品一区二区三区中文字幕 |