十、自定義ThreadPoolExecutor線程池

来源:https://www.cnblogs.com/lee0527/archive/2019/10/21/11716829.html
-Advertisement-
Play Games

自定義ThreadPoolExecutor線程池 自定義線程池需要遵循的規則 【1】線程池大小的設置 1、計算密集型: 顧名思義就是應用需要非常多的CPU計算資源,在多核CPU時代,我們要讓每一個CPU核心都參與計算,將CPU的性能充分利用起來,這樣才算是沒有浪費伺服器配置,如果在非常好的伺服器配置 ...


自定義ThreadPoolExecutor線程池

自定義線程池需要遵循的規則

【1】線程池大小的設置

1、計算密集型:
顧名思義就是應用需要非常多的CPU計算資源,在多核CPU時代,我們要讓每一個CPU核心都參與計算,將CPU的性能充分利用起來,這樣才算是沒有浪費伺服器配置,如果在非常好的伺服器配置上還運行著單線程程式那將是多麼重大的浪費。對於計算密集型的應用,完全是靠CPU的核數來工作,所以為了讓它的優勢完全發揮出來,避免過多的線程上下文切換,比較理想方案是:

​ 線程數 = CPU核數+1,也可以設置成CPU核數*2,但還要看JDK的版本以及CPU配置(伺服器的CPU有超線程)。

​ 一般設置CPU * 2即可。

2、IO密集型
我們現在做的開發大部分都是WEB應用,涉及到大量的網路傳輸,不僅如此,與資料庫,與緩存間的交互也涉及到IO,一旦發生IO,線程就會處於等待狀態,當IO結束,數據準備好後,線程才會繼續執行。因此從這裡可以發現,對於IO密集型的應用,我們可以多設置一些線程池中線程的數量,這樣就能讓在等待IO的這段時間內,線程可以去做其它事,提高併發處理效率。那麼這個線程池的數據量是不是可以隨便設置呢?當然不是的,請一定要記得,線程上下文切換是有代價的。目前總結了一套公式,對於IO密集型應用:
線程數 = CPU核心數/(1-阻塞繫數) 這個阻塞繫數一般為0.8~0.9之間,也可以取0.8或者0.9。

【2】線程池參數的相關配置

一定不要選擇沒有上限限制的配置項

​ 比如,Executors.newCachedThreadPool的設置與無界隊列的設置因為某些不可預期的情況,線程池會出現系統異常,導致線程暴增的情況或者任務隊列不斷膨脹,記憶體耗盡導致系統崩潰和異常。

儘量採用自定義的拒絕策略

自定義拒絕策略可以實現RejectedExecutionHandler介面;
JDK自帶的拒絕策略如下:
AbortPolicy:直接拋出異常阻止系統正常工作;
CallerRunsPolicy:只要線程池未關閉,該策略直接在調用者線程中,運行當前被丟棄的任務;
DiscardOldestPolicy:丟棄最老的一個請求,嘗試再次提交當前任務;
DiscardPolicy:丟棄無法處理的任務,不給予任何處理;

【3】利用Hook

利用Hook,留下線程池執行軌跡:
ThreadPoolExecutor提供了protected類型可以被覆蓋的鉤子方法,允許用戶在任務執行之前會執行之後做一些事情。我們可以通過它來實現比如初始化ThreadLocal、收集統計信息、如記錄日誌等操作。這類Hook如beforeExecute和afterExecute。另外還有一個Hook可以用來在任務被執行完的時候讓用戶插入邏輯,如rerminated 。
如果hook方法執行失敗,則內部的工作線程的執行將會失敗或被中斷。

​ 我們可以使用beforeExecute和afterExecute來記錄線程之前前和後的一些運行情況,也可以直接把運行完成後的狀態記錄到ELK等日誌系統.

【4】關閉線程池

內容當線程池不在被引用並且工作線程數為0的時候,線程池將被終止。我們也可以調用shutdown來手動終止線程池。如果我們忘記調用shutdown,為了讓線程資源被釋放,我們還可以使用keepAliveTime和allowCoreThreadTimeOut來達到目的!
當然,穩妥的方式是使用虛擬機Runtime.getRuntime().addShutdownHook方法,手工去調用線程池的關閉方法!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 庸置疑,Spring 早已成為 Java 後端開發事實上的行業標準,無數的公司選擇 Spring 作為基礎的開發框架,大部分 Java 後端程式員在日常工作中也會接觸到 Spring ,因此,如何用好 Spring ,也就成為 Java 程式員的必修課之一。 同時,Spring Boot 和 Spr ...
  • 本文接著上一篇寫的《Java微服務(二):服務消費者與提供者搭建》,上一篇文章主要講述了消費者與服務者的搭建與簡單的實現。其中重點需要註意配置文件中的幾個坑。 本章節介紹一些零散的內容:服務的負載均衡,序列化和熔斷 1.服務負載均衡 負載均衡可分為軟體負載均衡和硬體負載均衡。在我們日常開發中,一般很 ...
  • 最近用到NodeInstantiator批量加入實體 剛開始用的時候一直程式崩潰 錯誤代碼大致如下: 大體上代碼結構類似上面這樣,簡單起見NodeInstantiator的model就寫成2 manage_system是c++寫的一個QObject子類,存儲一些載入進來的數據 manage_syst ...
  • 表單驗證分為前端驗證和伺服器端驗證。 伺服器端驗證方面,Java提供了主要用於數據驗證的JSR 303規範,而Hibernate Validator實現了JSR 303規範。 項目依賴加入spring-boot-starter-thymeleaf時,預設就會加入Hibernate Validat... ...
  • ASCII碼:只有英文和拉丁字元,一個字元占一個位元組,8位 gb2312:只有6700個中文 1980年 gbk10:存了2萬多個中文 1995年 gb18030:27000中文 2000年 utf-32:一個字元占4個位元組 utf-16:一個字元占2個位元組或2個位元組以上 utf-8:英文用ASCI ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景描述 1、請假審批流程 公司常見的請假審批流程:請假天數 2、流程圖解 3、代碼實現 二、責任鏈模式 1、基礎概念 責任鏈模式是一種對象的行為模式。在責任鏈模式里,很多對象由每一個對象對其下個的引用而連接起來形成一條鏈式 ...
  • 在之前的 "EurekaClient自動裝配及啟動流程解析" 一文中我們提到過,在構造 類時,會把自身註冊到服務端,本文就來分析一下這個註冊流程 客戶端發起註冊 這個方法中包含的 和`instanceInfo`兩個對象在之前的文章中都已經單獨拿出來了: "Eureka中重要的對象" 服務端接受註冊 ...
  • 函數 def開頭 函數參數 其中name、age、sex為形參,'王錦時',21,'男'為實參 函數返回值 預設參數 關鍵字參數 收集參數 相當於把所有實參存在一個元組當中 收集參數和關鍵字參數的混合使用 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...