不是吧?線程池這樣搞?

其他系列文章目錄

設計模式合集

多線程合集

分布式合集

ES合集


文章目錄

系列文章目錄

前言

一、為什么需要線程池?

二、舉個背景例子

三、怎么創建線程池?

四、線程池指定線程數


前言

學習線程池能夠幫助我們更好地處理多線程編程,并提高程序的性能和穩定性


一、為什么需要線程池?

JVM在HotSpot的線程模型下,Java線程會一對一映射為內核線程。
這意味著,在Java中每次創建以及回收線程都會去內核創建以及回收。
這就有可能導致: 創建和銷毀線程所花費的時間和資源可能比處理的任務花費的時間和資源要更多。
線程池的出現是為了提高線程的復用性以及固定線程的數量!!!


二、舉個背景例子

一個消息管理平臺,提供其中一個功能就是: 運營會圈定人群然后群發消息。
主要流程大致就是:創建模板---->定時---->群發消息---->用戶收到消息

先說一個概念:HDFS (Hadoop Distributed File System) 是分布式文件系統的一種,用于存儲和處理大數據集。它是Hadoop框架的核心組件之一。HDFS可以讓用戶將大數據集分散在多臺計算機上,以提高數據處理能力和可靠性。它將數據拆分為小塊并存儲在多臺計算機上,提供了讀寫分離、容錯機制、數據備份和高可用等特性。HDFS的基本單位是數據塊,通常為128MB或256MB。數據塊的復制數量和位置由系統自動管理。HDFS對于大數據的存儲和管理提供了高度的可靠性和可擴展性,因此被廣泛應用于大數據處理和分析領域。

然后運營圈定的人群實際上在模板上只是一個ID、這邊要通過ID去獲取到HDFS文件,
對HDFS文件進行遍歷,然后繼續往下發,(接收到定時任務,再對HDFS進行遍歷)這里的處理,用的就是線程池處理。

HDFS遍歷其實就是IO的操作,把這個過程給異步化,為了提高系統的吞吐量,于是這里用的線程池。即便遍歷HDFS出現問題,我們可以建設完備的監控和告警可以及時發現。


三、怎么創建線程池?

阿里巴巴開發手冊就有提到,不要使用Executors去創建線程。建議使用ThreadPoolExecutor去創建線程池。

最主要的目的就是:使用ThreadPoolExecutor創建的線程你是更能了解線程池運行的規則,避免資源耗盡的風險。

七個核心參數:

  1. corePoolSize:核心線程數,線程池維護的最少線程數。

  2. maximumPoolSize:最大線程數,線程池維護的最大線程數。

  3. keepAliveTime:線程空閑時間,當線程池中的線程數大于核心線程數時,這些多余的線程會被銷毀,這個參數定義了這些線程的空閑時間。

  4. TimeUnit:時間單位,keepAliveTime的時間單位。

  5. workQueue:任務隊列,當提交的任務數量大于線程池當前可用的線程數時,任務會被存放在這個隊列中。

  6. threadFactory:線程工廠,用于創建線程池中的線程。

  7. handler:拒絕策略,當任務隊列已滿且線程池中的線程數量已達到最大值時,新提交的任務如何被拒絕執行。常用的拒絕策略有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。

任務提交流程:

  1. 首先會判斷運行線程數是否小于coreFoolSize,如果小于,則直接創建新的線程執行任務。
  2. 如果大于corePoolSize,判斷workQueue阻塞隊列是否已滿,如果還沒滿,則將任務放到阻塞隊列中。
  3. 如果workQueue阻塞隊列已經滿了則判斷當前線程數是否大于maximumPoolSize,如果沒大于則創建新的線程執行任務。
  4. 如果大于maximumPoolSize,則執行任務拒絕策略 (具體就是你自己實現的handler)。

這里有個點需要注意下,就是workQueue阻塞隊列滿了,但當前線程數小于maximumPoolSize,這時候會創建新的線程執行任務。

不過一般我們都是將corePoolSize和maximumPoolSize設置相同數量。
keepAliveTime指的就是,當前運行的線程數大于核心線程數了,只要空閑時間達到了,就會對線程進行回收。


四、線程池指定線程數

線程池指定線程數這塊,首先要考量自己的業務是什么樣的??

是cpu密集型的還是io密集型的,假設運行應用的機器CPU核心數是N

cpu密集型的可以先給到N+1,io密集型的可以給到2N

上面這個只是一個常見的經驗做法,具體究竟開多少線程,需要壓測才能比較準確地定下來。

注:線程不是說越大越好,在之前的我也提到過,多線程是為了充分利用CPU的資源。如果設置的線程過多,線程大量有上下文切換,這一部分也會帶來系統的開銷,這就得不償失了。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TikTok美區本土店鋪如何做好IP隔離?

為什么要進行IP隔離呢?因為我們無法在國內直接運營Shopee、TikTok、Lazada等平臺的本土店,平臺識別出店鋪登錄IP非本土IP,則容易導致店鋪風控、被標記為偽本土店,影響店鋪經營。 TikTok美區店鋪的IP隔離方法和Shopee本土店一致&a…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter,報文信息轉換器,將請求報文轉換為Java對象,或將Java對象轉換為響應報文 HttpMessageConverter提供了兩個注解和兩個類型:RequestBody,ResponseBody,Reque…

【MySQL】子查詢

文章目錄 子查詢IN運算符子查詢 VS 連接ALL關鍵字ANY關鍵字相關子查詢 !EXISTS運算符select子句中的子查詢from子句中的子查詢 子查詢 獲取價格大于id為3的貨物的商品 用到了內查詢,獲取id為3的商品的單價,把結構傳給外查詢 在where子句中編寫子查詢&am…

【python基礎(四)】if語句詳解

文章目錄 一. 一個簡單示例二. 條件測試1. 檢查多個條件1.1. 使用and關聯多個條件1.2. 使用or檢查多個條件1.3. in的判斷 2. 布爾表達式 三. if語句1. 簡單的if語句2. if-else語句3. if-elif-else結構4. 使用多個elif代碼塊5. 省略else代碼塊 四. 使用if語句處理列表1. 檢查特殊…

2023-11-23 LeetCode每日一題(HTML 實體解析器)

2023-11-23每日一題 一、題目編號 1410. HTML 實體解析器二、題目鏈接 點擊跳轉到題目位置 三、題目描述 「HTML 實體解析器」 是一種特殊的解析器,它將 HTML 代碼作為輸入,并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們…

Endnote軟件添加期刊引用格式

在下述網址中,找到你想要添加的期刊,下載引用格式文件(后綴為.ens格式) https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下載…

SQLY優化

insert優化 1.批量插入 手動事務提交 主鍵順序插入,主鍵順序插入性能高于亂序插入 2.大批量插入數據 如果一次性需要插入大批量數據,使用Insert語句插入性能較低,此時可以使用MYSQL數據庫提供的load指令進行插入 主鍵優化 主鍵設計原則 …

Java實現王者榮耀小游戲

主要功能 鍵盤W,A,S,D鍵:控制玩家上下左右移動。按鈕一:控制英雄發射一個矩形攻擊紅方小兵。按鈕控制英雄發射魅惑技能,傷害小兵并讓小兵停止移動。技能三:攻擊多個敵人并讓小兵停止移動。普攻:對小兵造成基礎傷害。小…

vue3 終端實現 (vue3+xterm+websocket)

目錄 一、xterm介紹 二、效果展示 三、vue文件實現代碼 一、xterm介紹 xterm是一個使用

【C++初階】STL詳解(七)Stack與Queue的模擬實現

本專欄內容為:C學習專欄,分為初階和進階兩部分。 通過本專欄的深入學習,你可以了解并掌握C。 💓博主csdn個人主頁:小小unicorn ?專欄分類:C 🚚代碼倉庫:小小unicorn的代碼倉庫&…

力扣labuladong一刷day17天前綴和數組

力扣labuladong一刷day17天前綴和數組 一、303. 區域和檢索 - 數組不可變 題目鏈接:https://leetcode.cn/problems/range-sum-query-immutable/ 思路:本題即為讓寫一個類用于計算指定區間內的數字和,但如果直接采用for循環的方式&#xff0…

Unity調用dll踩坑記

請用寫一段代碼,讓unity無聲無息的崩潰。 你說這怕是有點難哦,誰會這么不幸呢?不幸的是,我幸運的成為了那個不幸的人。 unity里面調用dll的方式是使用 DllImport ,比如有一個 Hello.dll,里面有一個 char* …

圖片如何去除水印?試試這三種去水印方法!

從事自媒體行業的小伙伴們,你們是否經常為文章配圖而煩惱呢?下載的圖片大部分帶有各種各樣的水印或者多余元素,讓人感到困擾。今天,我要分享三個去水印的妙招,這是新媒體人必備的圖片處理技能,快來一起學起…

【MATLAB源碼-第87期】基于matlab的Q-learning算法柵格地圖路徑規劃,自主選擇起始點和障礙物。

操作環境: MATLAB 2022a 1、算法描述 Q-learning是一種無模型的強化學習算法,適用于有限的馬爾可夫決策過程(MDP)。它的核心是學習一個動作價值函數(action-value function),即Q函數&#xf…

面試官:【js多維數組扁平化去重并排序】

文章目錄 前言方法一方法二方法三方法四總結后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:JavaScript 🐱?👓博主在前端領域還有很多知識和技術需要掌握,正在不斷努力填補技術短板。(如果出現錯誤&a…

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB在實戰項目中替換Milvus測試

為什么嘗試使用Tencent Cloud VectorDB替換Milvus向量庫? 亮點:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的負擔(搭建一個生產環境的模型實在耗費精力和體力)。 騰訊云向量數據庫是什么? 騰…

rsync配置和守護進程實踐

目錄 一、rsync概念 1.rsync簡介 2.rsync特點 3、增量和全局傳輸 二、Rsync工作方式 1.準備好rsync備份服務器 2.本地的數據傳輸模式 3.遠程的數據傳輸模式 4.rsync數據推拉模式 三、實踐 1.準備三臺虛擬機 2.都安裝rsync服務 3.拉取遠程文件 3.推送文件 4.rsyn…

Oracle用戶(User)和表空間(Tablespace)

3. 用戶和表空間 3.1. 用戶 1)概念 Oracle數據庫中,用戶(User)是訪問數據庫的途徑和認證方式,同時,用戶也是數據庫對象的邏輯集合。我們通過數據庫用戶和密碼來登錄數據庫,然后,可以在該用戶下創建和操作數據庫對象。 2)創建和配置 創建Oracle用戶,需要具備創建…

python系統編程

文章目錄 系統編程系統工具概述sys模塊os模塊 腳本運行上下文當前工作路徑命令行參數shell環境變量標準流 文件和目錄工具文件工具目錄工具 并行系統工具進程分支線程 系統編程 系統工具 概述 python系統模塊: 模塊名作用*sys負責導出與怕以后呢解釋器本身相關的組件*os包含…

Django DRF序列化器serializer

以下案例由淺到深&#xff0c;逐步深入&#xff0c;通過實例介紹了序列化器的使用方法&#xff0c;和其中遇到的常見問題的解決。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…