最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解Java線程池的原理和監(jiān)控

 更新時(shí)間:2023年07月18日 08:31:15   作者:擺爛的小趴菜  
這篇文章主要介紹了深入了解Java線程池的原理和監(jiān)控,創(chuàng)建Java線程需要給線程分配堆棧內(nèi)存以及初始化內(nèi)存,還需要進(jìn)行系統(tǒng)調(diào)用,頻繁地創(chuàng)建和銷毀線程會(huì)大大降低系統(tǒng)的運(yùn)行效率,這時(shí)候就要用到線程池,需要的朋友可以參考下

一、什么是線程池

簡(jiǎn)單看名字就知道是裝有線程的池子,我們可以把要執(zhí)行的多線程交給線程池來(lái)處理,和連接池的概念一樣,通過(guò)維護(hù)一定數(shù)量的線程池來(lái)達(dá)到多個(gè)線程的復(fù)用。

二、線程池的好處

我們知道不用線程池的話,每個(gè)線程都要通過(guò)new Thread(xxRunnable).start()的方式來(lái)創(chuàng)建并運(yùn)行一個(gè)線程,線程少的話這不會(huì)是問(wèn)題

而真實(shí)環(huán)境可能會(huì)開(kāi)啟多個(gè)線程讓系統(tǒng)和程序達(dá)到最佳效率,當(dāng)線程數(shù)達(dá)到一定數(shù)量就會(huì)耗盡系統(tǒng)的CPU和內(nèi)存資源,也會(huì)造成GC頻繁收集和停頓

因?yàn)槊看蝿?chuàng)建和銷毀一個(gè)線程都是要消耗系統(tǒng)資源的,如果為每個(gè)任務(wù)都創(chuàng)建線程這無(wú)疑是一個(gè)很大的性能瓶頸。

所以,線程池中的線程復(fù)用極大節(jié)省了系統(tǒng)資源,當(dāng)線程一段時(shí)間不再有任務(wù)處理時(shí)它也會(huì)自動(dòng)銷毀,而不會(huì)長(zhǎng)駐內(nèi)存。

三、使用線程池能解決的問(wèn)題

1、效率

創(chuàng)建/銷毀線程伴隨著系統(tǒng)開(kāi)銷,過(guò)于頻繁的創(chuàng)建/銷毀線程,會(huì)很大程度上影響處理效率

例如:記創(chuàng)建線程消耗時(shí)間T1,執(zhí)行任務(wù)消耗時(shí)間T2,銷毀線程消耗時(shí)間T3,如果T1+T3>T2,那么是不是說(shuō)開(kāi)啟一個(gè)線程來(lái)執(zhí)行這個(gè)任務(wù)太不劃算了!

正好,線程池緩存線程,可用已有的閑置線程來(lái)執(zhí)行新任務(wù),避免了T1+T3帶來(lái)的系統(tǒng)開(kāi)銷

2、阻塞

線程并發(fā)數(shù)量過(guò)多,搶占系統(tǒng)資源從而導(dǎo)致阻塞

我們知道線程能共享系統(tǒng)資源,如果同時(shí)執(zhí)行的線程過(guò)多,就有可能導(dǎo)致系統(tǒng)資源不足而產(chǎn)生阻塞的情況 運(yùn)用線程池能有效的控制線程最大并發(fā)數(shù),避免以上的問(wèn)題

3、對(duì)線程進(jìn)行一些簡(jiǎn)單的管理

比如:延時(shí)執(zhí)行、定時(shí)循環(huán)執(zhí)行的策略等,運(yùn)用線程池都能進(jìn)行很好的實(shí)現(xiàn)

四、線程池的優(yōu)勢(shì)

在業(yè)務(wù)場(chǎng)景中, 如果一個(gè)對(duì)象創(chuàng)建銷毀開(kāi)銷比較大, 那么此時(shí)建議池化對(duì)象進(jìn)行管理。

例如線程,jdbc連接等等, 在高并發(fā)場(chǎng)景中, 如果可以復(fù)用之前銷毀的對(duì)象, 那么系統(tǒng)效率將大大提升。

另外一個(gè)好處是可以設(shè)定池化對(duì)象的上限, 例如預(yù)防創(chuàng)建線程數(shù)量過(guò)多導(dǎo)致系統(tǒng)崩潰的場(chǎng)景。

五、線程池類的主要參數(shù)

  • corePoolSize:線程池的核心大小,也可以理解為最小的線程池大小。
  • maximumPoolSize:最大線程池大小。
  • keepAliveTime:空余線程存活時(shí)間,指的是超過(guò)corePoolSize的空余線程達(dá)到多長(zhǎng)時(shí)間才進(jìn)行銷毀。
  • unit:銷毀時(shí)間單位。
  • workQueue:存儲(chǔ)等待執(zhí)行線程的工作隊(duì)列。
  • threadFactory:創(chuàng)建線程的工廠,一般用默認(rèn)即可。
  • handler:拒絕策略,當(dāng)工作隊(duì)列、線程池全已滿時(shí)如何拒絕新任務(wù),默認(rèn)拋出異常。

六、線程池的工作原理

如果線程池中的線程小于corePoolSize時(shí)就會(huì)創(chuàng)建新線程直接執(zhí)行任務(wù)。

如果線程池中的線程大于corePoolSize時(shí)就會(huì)暫時(shí)把任務(wù)存儲(chǔ)到工作隊(duì)列workQueue中等待執(zhí)行。

如果工作隊(duì)列workQueue也滿時(shí),當(dāng)線程數(shù)小于最大線程池?cái)?shù)maximumPoolSize時(shí)就會(huì)創(chuàng)建新線程來(lái)處理,而線程數(shù)大于等于最大線程池?cái)?shù)maximumPoolSize時(shí)就會(huì)執(zhí)行拒絕策略。

一般流程圖如下

在這里插入圖片描述

七、線程池大小設(shè)置

配置線程池的大小可根據(jù)以下幾個(gè)維度進(jìn)行分析來(lái)配置合理的線程數(shù):

  • 任務(wù)性質(zhì)可分為:CPU密集型任務(wù),IO密集型任務(wù),混合型任務(wù)。
  • 任務(wù)的執(zhí)行時(shí)長(zhǎng)。
  • 任務(wù)是否有依賴——依賴其他系統(tǒng)資源,如數(shù)據(jù)庫(kù)連接等。

1、CPU密集型任務(wù)

盡量使用較小的線程池,一般為CPU核數(shù)+1。 因?yàn)镃PU密集型任務(wù)使得CPU使用率很高,若開(kāi)過(guò)多的線程數(shù),只能增加上下文切換的次數(shù),因此會(huì)帶來(lái)額外的開(kāi)銷。

2、IO密集型任務(wù)

可以使用稍大的線程池,一般為2*CPU核數(shù)+1。 因?yàn)镮O操作不占用CPU,不要讓CPU閑下來(lái),應(yīng)加大線程數(shù)量,因此可以讓CPU在等待IO的時(shí)候去處理別的任務(wù),充分利用CPU時(shí)間。

3、混合型任務(wù)

可以將任務(wù)分成IO密集型和CPU密集型任務(wù),然后分別用不同的線程池去處理。 只要分完之后兩個(gè)任務(wù)的執(zhí)行時(shí)間相差不大,那么就會(huì)比串行執(zhí)行來(lái)的高效。 因?yàn)槿绻麆澐种髢蓚€(gè)任務(wù)執(zhí)行時(shí)間相差甚遠(yuǎn),那么先執(zhí)行完的任務(wù)就要等后執(zhí)行完的任務(wù),最終的時(shí)間仍然取決于后執(zhí)行完的任務(wù),而且還要加上任務(wù)拆分與合并的開(kāi)銷,得不償失

4、依賴其他資源

如某個(gè)任務(wù)依賴數(shù)據(jù)庫(kù)的連接返回的結(jié)果,這時(shí)候等待的時(shí)間越長(zhǎng),則CPU空閑的時(shí)間越長(zhǎng),那么線程數(shù)量應(yīng)設(shè)置得越大,才能更好的利用CPU。 借鑒別人的文章 對(duì)線程池大小的估算公式:

最佳線程數(shù)目 = ((線程等待時(shí)間+線程CPU時(shí)間)/線程CPU時(shí)間 )* CPU數(shù)目

比如平均每個(gè)線程CPU運(yùn)行時(shí)間為0.5s,而線程等待時(shí)間(非CPU運(yùn)行時(shí)間,比如IO)為1.5s,CPU核心數(shù)為8,那么根據(jù)上面這個(gè)公式估算得到:((0.5+1.5)/0.5)*8=32。

可以得出一個(gè)結(jié)論: 線程等待時(shí)間所占比例越高,需要越多線程。線程CPU時(shí)間所占比例越高,需要越少線程。

但是通過(guò)公式計(jì)算出來(lái)的線程池大小也只是參考,準(zhǔn)確的線程池設(shè)置大小還是需要經(jīng)過(guò)性能測(cè)試驗(yàn)證獲得的。

八、線程池監(jiān)控

通過(guò)工具類監(jiān)控線程池的使用、狀態(tài)等,例如通過(guò)JDK自帶的Jconsole、Jvisualvm監(jiān)控

1)首先我們先手動(dòng)創(chuàng)建一個(gè)簡(jiǎn)單的死鎖程序并運(yùn)行

在這里插入圖片描述

2)使用JDK自帶的Jconsole進(jìn)行監(jiān)控,選擇text進(jìn)程并連接

在這里插入圖片描述

3)點(diǎn)擊檢測(cè)死鎖,選擇線程并查看信息,可以定位到j(luò)ava代碼發(fā)生死鎖的位置

在這里插入圖片描述

在這里插入圖片描述

4)使用JAVA自帶的jvisualvm進(jìn)行監(jiān)控,選擇text進(jìn)程

在這里插入圖片描述

5)選擇線程TAB,查看線程信息,如果存在死鎖會(huì)出現(xiàn)下圖的樣式

在這里插入圖片描述

6)點(diǎn)擊線程Dump之后進(jìn)入新頁(yè)面拖到最底下就能看到線程死鎖詳細(xì)信息

在這里插入圖片描述

另外除了監(jiān)控線程死鎖,還可以通過(guò)線程池提供的以下參數(shù)對(duì)線程池進(jìn)行監(jiān)控。

  • taskCount:線程池需要執(zhí)行的任務(wù)數(shù)量,包括已經(jīng)執(zhí)行完的、未執(zhí)行的和正在執(zhí)行的。
  • completedTaskCount:線程池在運(yùn)行過(guò)程中已完成的任務(wù)數(shù)量,completedTaskCount <= taskCount。
  • largestPoolSize:線程池曾經(jīng)創(chuàng)建過(guò)的最大線程數(shù)量,通過(guò)這個(gè)數(shù)據(jù)可以知道線程池是否滿過(guò)。如等于線程池的最大大小,則表示線程池曾經(jīng)滿了。
  • getPoolSize: 線程池的線程數(shù)量。如果線程池不銷毀的話,池里的線程不會(huì)自動(dòng)銷毀,所以線程池的線程數(shù)量只增不減。
  • getActiveCount:獲取活動(dòng)的線程數(shù)。

九、總結(jié)

對(duì)于監(jiān)控而言,不在于手段的多樣性,而需要明白監(jiān)控的本質(zhì),以及需要的監(jiān)控項(xiàng)內(nèi)容,找出系統(tǒng)瓶頸,規(guī)避風(fēng)險(xiǎn)。

到此這篇關(guān)于深入了解Java線程池的原理和監(jiān)控的文章就介紹到這了,更多相關(guān)Java線程池原理和監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven 插件配置分層架構(gòu)深度解析

    Maven 插件配置分層架構(gòu)深度解析

    這篇文章主要介紹了Maven 插件配置分層架構(gòu)深度解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • Java創(chuàng)建對(duì)象的四種方式詳解

    Java創(chuàng)建對(duì)象的四種方式詳解

    這篇文章主要介紹了Java創(chuàng)建對(duì)象的四種方式詳解,如果我們不想利用默認(rèn)構(gòu)造器來(lái)創(chuàng)建java對(duì)象,而想利用指定的構(gòu)造器來(lái)創(chuàng)建java對(duì)象,則需要利用Construtor對(duì)象,每個(gè)Construtor對(duì)應(yīng)一個(gè)構(gòu)造器,需要的朋友可以參考下
    2023-11-11
  • NetBeans安裝提示neatbeans cannot find java 1.8 or higher

    NetBeans安裝提示neatbeans cannot find java 1.8 or higher

    今天小編就為大家分享一篇關(guān)于NetBeans安裝提示neatbeans cannot find java 1.8 or higher,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例代碼

    SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例代碼

    Tess4J是一個(gè)基于Tesseract OCR引擎的Java接口,可以用來(lái)識(shí)別圖像中的文本,說(shuō)白了,就是封裝了它的API,讓Java可以直接調(diào)用,本文給大家介紹了SpringBoot集成Tess4J實(shí)現(xiàn)OCR的示例,需要的朋友可以參考下
    2024-12-12
  • SpringBoot使用Spark過(guò)程詳解

    SpringBoot使用Spark過(guò)程詳解

    這篇文章主要介紹SpringBoot使用Spark的方法的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望能幫助大家解決問(wèn)題
    2023-02-02
  • java基礎(chǔ)之注解示例詳解

    java基礎(chǔ)之注解示例詳解

    大家好,本篇文章主要講的是java基礎(chǔ)之注解示例詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 淺談JAVA設(shè)計(jì)模式之享元模式

    淺談JAVA設(shè)計(jì)模式之享元模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之享元模式的的相關(guān)資料,文中詳細(xì)的介紹了享元模式的概念以及使用方法,感興趣的朋友可以了解下
    2020-06-06
  • Java中的Sentinel規(guī)則持久化詳解

    Java中的Sentinel規(guī)則持久化詳解

    這篇文章主要介紹了Java中的Sentinel規(guī)則持久化詳解,將限流配置規(guī)則持久化進(jìn)Nacos保存,只要刷新8401某個(gè)rest地址,sentinel控制臺(tái)的流控規(guī)則就能看到,只要Nacos里面的配置不刪除,針對(duì)8401上sentinel上的流控規(guī)則持續(xù)有效,需要的朋友可以參考下
    2023-09-09
  • java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值

    Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值

    這篇文章主要介紹了Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

个旧市| 育儿| 临清市| 小金县| 堆龙德庆县| 元阳县| 特克斯县| 重庆市| 米泉市| 洪雅县| 鸡西市| 浪卡子县| 庆云县| 霍城县| 铜鼓县| 聂拉木县| 诸城市| 盐边县| 土默特左旗| 含山县| 五指山市| 柘荣县| 阳朔县| 浦北县| 华阴市| 苍南县| 泰和县| 如皋市| 抚远县| 临沧市| 永城市| 阿巴嘎旗| 巴马| 翼城县| 论坛| 苍梧县| 三门县| 会泽县| 富锦市| 乃东县| 马尔康县|