Java 線程池相關問題

線程池的拒絕策略

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

如何使用好線程池

線程個數大小的設置

計算密集型

  • 顧名思義就是應用需要非常多的CPU計算資源,在多核CPU時代,我們要讓每一個CPU核心都參與計算,將CPU的性能充分利用起來,這樣才算是沒有浪費服務器配置,如果在非常好的服務器配置上還運行著單線程程序那將是多么重大的浪費
  • 對于計算密集型的應用,完全是靠CPU的核數來工作,所以為了讓它的優勢完全發揮出來,避免過多的線程上下文切換,比較理想方案是: 線程數 = CPU核數+1,也可以設置成CPU核數*2,但還要看JDK的版本以及CPU配置(服務器的CPU有超線程)

IO密集型

  • 就很好理解了,我們現在做的開發大部分都是WEB應用,涉及到大量的網絡傳輸,不僅如此,與數據庫,與緩存間的交互也涉及到IO,一旦發生IO,線程就會處于等待狀態,當IO結束,數據準備好后,線程才會繼續執行
  • 因此從這里可以發現,對于IO密集型的應用,我們可以多設置一些線程池中線程的數量,這樣就能讓在等待IO的這段時間內,線程可以去做其它事,提高并發處理效率。那么這個線程池的數據量是不是可以隨便設置呢?當然不是的,請一定要記得,線程上下文切換是有代價的
  • 目前總結了一套公式,對于IO密集型應用: 線程數 = CPU核心數/(1-阻塞系數) 這個阻塞系數一般為0.8~0.9之間,也可以取0.8或者0.9。 套用公式,對于雙核CPU來說,它比較理想的線程數就是20,當然這都不是絕對的,需要根據實際情況以及實際業務來調整:final int poolSize = (int)(cpuCore/(1-0.9))

線程池相關參數配置

  • 使用線程池的時候都不要選擇沒有上限限制的配置項。 第一,我們不要去使用沒有上限的線程池和設置無界隊列! 比如,newCachedThreadPool的設置與無界隊列的設置因為某些不可預期的情況,線程池會出現系統異常,導致線程暴增的情況或者任務隊列不斷膨脹,內存耗盡導致系統崩潰和異常。 我們推薦使用自定義線程池來避免該問題,這也是在使用線程池規范的首要原則
  • 合理設置線程數量、和線程空閑回收時間,根據具體的任務執行周期和時間去設定,避免頻繁的回收和創建,雖然我們使用線程池的目的是為了提升系統性能和吞吐量,但是也要考慮下系統的穩定性,不然出現不可預期問題會很麻煩
  • 根據實際場景,選擇適用于自己的拒絕策略。進行補償,不要亂用JDK支持的自動補償機制!盡量采用自定義的拒絕策略去進行兜底

利用Hook嵌入你的行為

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

線程池的關閉?

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

?

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

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

相關文章

對編程人員我想說:多做 多實踐 多寫代碼

有很多人問我,怎樣提高自己的能力?有初學者,有水平達到一定程度的程序員。 我想說,不要過多的看代碼,看計算機理論,看別人寫的文章,代碼等,最重要的是自己理解了某個原理&#xff0c…

讀人是基礎,看人是關鍵,做人最重要

人生在世,讀人是基礎,看人是關鍵,做人最重要。 一、讀人——一個人就是一本書。讀人,比讀其他文字的書更難。在生活中,每個人都是書,每人又都是讀者。我們認認真真地讀,讀了大半輩子&#xff0c…

使用postman模擬百度通用文字識別

1,登錄百度AI開放平臺 百度AI網站新手指南鏈接在頂部導航欄中,找到控制臺選項,輸入賬號和密碼,進入管理中心頁面在管理中心頁面中,找到文字識別的選項找到創建應用的選項,進行ocr項目的創建需要輸入應用的…

3個觀念 不再瞎學習!

此刻,你應該要做什么準備?加碼股市還是追逐房市?都不是。在你分配時間、資源的投資組合里,有沒有這一項:“自己”? 沒有人會否認充實自我的重要,但是經歷一場金融風暴大震撼,當企業…

Java調用百度OCR文字識別的接口

調用百度OCR文字識別的接口,來自于百度官網,親測可以使用 跳轉鏈接FileUtil的下載鏈接Base64Util下載鏈接HttpUtil下載鏈接GsonUtils下載鏈接Accurate.java文件 package com.baidu.ai.aip;import com.baidu.ai.aip.utils.Base64Util; import com.baidu.…

做好7步 迅速成為行業專家

行行出狀元,但不一定人人能成為行業專家或權威。無論是做獨立顧問,還是手下有250名員工的工廠主管,都是在用自己多年豐富經驗在幫助企業成功。既然有了專業知識和經驗,為什么不把它最大化利用,來建立自己的行業權威&am…

redis常用命令與特性

keys * 返回滿足條件的所有key,可以模糊匹配select 數字0-15,進行數據庫切換,默認0-15個exists 是否存在指定的keypersist 取消過期時間 select 選擇數據庫 (0-15,總共16個數據庫)move key index 將當前數據…

緊急不代表重要:管理時間的六個秘密

當整個世界都永遠在跟集中精神做事做對的時候,怎么辦?Managershare:“世界上效率最高的程序員有什么相同之處?不是經驗,薪水或者花在一個項目上的時間,而是他們的老板創造了一個免于走神的環境。”這老板太…

redis安全

定期打補丁禁止一些高危命令 (flushdb、keys *、flushall)以低權限運行 Redis 服務禁止外網訪問 Redis設置訪問密碼 足夠復雜,防止暴力破解 requirepass xxxxxxxx訪問權限 內網通過acl限制可以訪問redis的ip和端口

如何在三個月內獲得三年的工作經驗

在多年的工作生涯中,總會目睹一批人的升職像火箭速度一樣。 而總有一批人,就像蝸牛一樣,工作崗位和職位幾乎從來不變。 我們看看,2個名人的快速成長史。 一個是教英語的李陽,他讀大學時成績不好,英語不…

Redis Cluster集群模式

Redis Cluster 它是Redis的分布式解決方案,在Redis 3.0版本正式推出的,有效解決了Redis分布式方面的需求。當遇到單機內存、并發、流量等瓶頸時,可以采用Cluster架構達到負載均衡的目的。數據分布理論: 分布式數據庫首要解決把整個數據集按照…

永遠和靠譜的人在一起!

巴菲特每年都會同大學生進行座談,在一次交流會上,有學生問他:您認為一個人最重要的品質是什么?巴菲特沒有正面回答這個問題,而是講了一個小游戲,名為:買進你同學的10%。 巴菲特說:現在給你們一…

Redis事務詳解

傳統事務的特性 原子性一致性隔離性:事務之間互不干擾持久化:一旦事務提交,無法修改 Redis事務機制 MULTI、EXEC、DISCARD和WATCH命令是Redis事務功能的基礎。Redis事務允許在一次單獨的步驟中執行一組命令,并且可以保證如下兩個…

工作的最終目的

當時公司招了大批應屆本科和研究生畢業的新新人類。平均年齡25歲。那個新的助理,是經過多次面試后,我親自招回來的一個女孩。名牌大學本科畢業,聰明,性格活潑。私下里我得承認,我招她的一個很重要的原因,除…

銷售員所做的一切工作最終目的就是為了成交

(1)最后一次報價禁忌.報價過晚或者過于匆忙步幅度太大,顯得過于慷慨;讓步幅度太小,顯得毫無意義當談判進展到最后,雙方只是在最后的某一兩個問題上尚有不同意見,過讓步才能求得一致,簽訂協議。在…

Redis java客戶端操作

jedis jedis官方指定的redis java客戶端&#xff0c;將其導入到pom.xml問價內 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><vers…

HEVC/H265 namespace 介紹

在 HEVC/H265 代碼中&#xff0c;有三個使用的namespace&#xff1a; 1. df 2. df::program_options_lite 3. RasterAddress 對于第一個 df 的namespace&#xff0c;我一直百思不得其解&#xff0c;df 是什么含義&#xff1f;老外對起名是很重視的&#xff0c;肯定有原因。…

Redis整合Springboot實現數據共享

代碼的整體結構 RedisSessionConfig.java package com.cc.springbootredissession.config;import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;Configuration E…

人生什么最重要

什么最重要 20歲的人說,學習成績最重要.一次考試分數,可以把人分為三六九等.&#xff02;博士&#xff02;,&#xff02;本科&#xff02;,&#xff02;大專&#xff02;&#xff02;高職&#xff02;&#xff02;中專&#xff02;,成績好的上好學校,成績差的上差學校;成績好的…

Redis整合Springboot實現單機配置

整體結構 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…