欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程池的優(yōu)點(diǎn)及池化技術(shù)的應(yīng)用

 更新時(shí)間:2022年05月08日 16:26:54   作者:??Java中文社群????  
這篇文章主要介紹了Java線程池的優(yōu)點(diǎn)及池化技術(shù)的應(yīng)用,Java種提高程序的執(zhí)行效率有兩種實(shí)現(xiàn)方法,一個(gè)是使用線程、另一個(gè)是使用線程池,下文我們就來(lái)具體介紹該詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下

前言:

在 Java 語(yǔ)言中,提高程序的執(zhí)行效率有兩種實(shí)現(xiàn)方法,一個(gè)是使用線程、另一個(gè)是使用線程池。而在生產(chǎn)環(huán)境下,我們通常會(huì)采用后者。為什么會(huì)這樣呢?今天我們就來(lái)聊聊線程池的優(yōu)點(diǎn),以及池化技術(shù)及其應(yīng)用。

1.池化技術(shù)

池化技術(shù)指的是提前準(zhǔn)備一些資源,在需要時(shí)可以重復(fù)使用這些預(yù)先準(zhǔn)備的資源。 池化技術(shù)的優(yōu)點(diǎn)主要有兩個(gè):提前準(zhǔn)備和重復(fù)利用。 以 Java 語(yǔ)言中的對(duì)象創(chuàng)建為例,在對(duì)象創(chuàng)建時(shí)要經(jīng)歷以下步驟:

  • 根據(jù) new 標(biāo)識(shí)符后面的參數(shù),在常量池查找類的符號(hào)引用;
  • 如果沒(méi)找到符號(hào)應(yīng)用(類并未加載),進(jìn)行類的加載、解析、初始化等;
  • 虛擬機(jī)為對(duì)象在堆中分配內(nèi)存,并將分配的內(nèi)存初始化為 0,針對(duì)對(duì)象頭,建立相應(yīng)的描述結(jié)構(gòu)(耗時(shí)操作:需要查找堆中的空閑區(qū)域,修改內(nèi)存分配狀態(tài)等);
  • 調(diào)用對(duì)象的初始化方法(耗時(shí)操作:用戶的復(fù)雜的邏輯驗(yàn)證等操作,如IO、數(shù)值計(jì)算是否符合規(guī)定等)。

從上述的流程中可以看出,創(chuàng)建一個(gè)類需要經(jīng)歷復(fù)雜且耗時(shí)的操作,因此我們應(yīng)該盡量復(fù)用已有的類,以確保程序的高效運(yùn)行,當(dāng)然如果能夠提前創(chuàng)建這些類就再好不過(guò)了,而這些功能的實(shí)現(xiàn)依靠的就是池化技術(shù)。

2.池化技術(shù)應(yīng)用

常見(jiàn)的池化技術(shù)的應(yīng)用有:線程池、內(nèi)存池、數(shù)據(jù)庫(kù)連接池、HttpClient 連接池等,接下來(lái),我們分別來(lái)看。

2.1 線程池

線程池的原理很簡(jiǎn)單,類似于操作系統(tǒng)中的緩沖區(qū)的概念。線程池中會(huì)先啟動(dòng)若干數(shù)量的線程,這些線程都處于睡眠狀態(tài)。當(dāng)客戶端有一個(gè)新的請(qǐng)求時(shí),就會(huì)喚醒線程池中的某一個(gè)睡眠的線程,讓它來(lái)處理客戶端的這個(gè)請(qǐng)求,當(dāng)處理完這個(gè)請(qǐng)求之后,線程又處于睡眠的狀態(tài)。 線程池能很高地提升程序的性能。比如有一個(gè)省級(jí)數(shù)據(jù)大集中的銀行網(wǎng)絡(luò)中心,高峰期每秒的客戶端請(qǐng)求并發(fā)數(shù)超過(guò) 100,如果為每個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè)新的線程的話,那耗費(fèi)的 CPU 時(shí)間和內(nèi)存都是十分驚人的,如果采用一個(gè)擁有 200 個(gè)線程的線程池,那將會(huì)節(jié)約大量的系統(tǒng)資源,使得更多的 CPU 時(shí)間和內(nèi)存用來(lái)處理實(shí)際的商業(yè)應(yīng)用,而不是頻繁的線程創(chuàng)建和銷(xiāo)毀。 

2.2 內(nèi)存池

如何更好地管理應(yīng)用程序內(nèi)存的使用,同時(shí)提高內(nèi)存使用的頻率,這是值得每一個(gè)開(kāi)發(fā)人員深思的問(wèn)題。內(nèi)存池(Memory Pool)就提供了一個(gè)比較可行的解決方案。 內(nèi)存池在創(chuàng)建的過(guò)程中,會(huì)預(yù)先分配足夠大的內(nèi)存,形成一個(gè)初步的內(nèi)存池。然后每次用戶請(qǐng)求內(nèi)存的時(shí)候,就會(huì)返回內(nèi)存池中的一塊空閑的內(nèi)存,并將這塊內(nèi)存的標(biāo)志置為已使用。當(dāng)內(nèi)存使用完畢釋放內(nèi)存的時(shí)候,也不是真正地調(diào)用 free 或 delete 的過(guò)程,而是把內(nèi)存放回內(nèi)存池的過(guò)程,且放回的過(guò)程要把標(biāo)志置為空閑。最后,應(yīng)用程序結(jié)束就會(huì)將內(nèi)存池銷(xiāo)毀,將內(nèi)存池中的每一塊內(nèi)存釋放。 內(nèi)存池的優(yōu)點(diǎn)

  • 減少內(nèi)存碎片的產(chǎn)生,這個(gè)優(yōu)點(diǎn)可以從創(chuàng)建內(nèi)存池的過(guò)程中看出,當(dāng)我們?cè)趧?chuàng)建內(nèi)存池的時(shí)候,分配的都是一塊塊比較規(guī)整的內(nèi)存塊,減少內(nèi)存碎片的產(chǎn)生。
  • 提高了內(nèi)存的使用頻率。這個(gè)可以從分配內(nèi)存和釋放內(nèi)存的過(guò)程中看出。每次的分配和釋放并不是去調(diào)用系統(tǒng)提供的函數(shù)或操作符去操作實(shí)際的內(nèi)存,而是在復(fù)用內(nèi)存池中的內(nèi)存。

內(nèi)存池的缺點(diǎn): 會(huì)造成內(nèi)存的浪費(fèi),因?yàn)橐褂脙?nèi)存池需要在一開(kāi)始分配一大塊閑置的內(nèi)存,而這些內(nèi)存不一定全部被用到。

2.3 數(shù)據(jù)庫(kù)連接池

數(shù)據(jù)庫(kù)連接池的基本思想是在系統(tǒng)初始化的時(shí)候?qū)?shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,并非建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對(duì)象。在使用完畢后,用戶也不是將連接關(guān)閉,而是將連接放回到連接池中,以供下一個(gè)請(qǐng)求訪問(wèn)使用,而這些連接的建立、斷開(kāi)都是由連接池自身來(lái)管理的。 同時(shí),還可以設(shè)置連接池的參數(shù)來(lái)控制連接池中的初始連接數(shù)、連接的上下限數(shù)和每個(gè)連接的最大使用次數(shù)、最大空閑時(shí)間等。當(dāng)然,也可以通過(guò)連接池自身的管理機(jī)制來(lái)監(jiān)視連接的數(shù)量、使用情況等。

2.4 HttpClient連接池

HttpClient 我們經(jīng)常用來(lái)進(jìn)行 HTTP 服務(wù)訪問(wèn)。我們的項(xiàng)目中會(huì)有一個(gè)獲取任務(wù)執(zhí)行狀態(tài)的功能使用 HttpClient,一秒鐘請(qǐng)求一次,經(jīng)常會(huì)出現(xiàn) Conection Reset 異常。經(jīng)過(guò)分析發(fā)現(xiàn),問(wèn)題是出在 HttpClient 的每次請(qǐng)求都會(huì)新建一個(gè)連接,當(dāng)創(chuàng)建連接的頻率比關(guān)閉連接的頻率大的時(shí)候,就會(huì)導(dǎo)致系統(tǒng)中產(chǎn)生大量處于 TIME_CLOSED 狀態(tài)的連接,這個(gè)時(shí)候使用連接池復(fù)用連接就能解決這個(gè)問(wèn)題。

3.線程池介紹

線程池是線程使用的一種模式,它將線程和任務(wù)的概念分離開(kāi),使用線程來(lái)執(zhí)行任務(wù),并提供統(tǒng)一的線程管理和任務(wù)管理的實(shí)現(xiàn)方法,避免了頻繁創(chuàng)建和銷(xiāo)毀線程所帶來(lái)的性能開(kāi)銷(xiāo)。

4.線程池優(yōu)點(diǎn)分析

線程池相比于線程來(lái)說(shuō),它不需要頻繁的創(chuàng)建和銷(xiāo)毀線程,線程一旦創(chuàng)建之后,默認(rèn)情況下就會(huì)一直保持在線程池中,等到有任務(wù)來(lái)了,再用這些已有的線程來(lái)執(zhí)行任務(wù),

如下圖所示: 

優(yōu)點(diǎn)1:復(fù)用線程,降低資源消耗

線程在創(chuàng)建時(shí)要開(kāi)辟虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器等私有線程的內(nèi)存空間,而銷(xiāo)毀時(shí)又要回收這些私有空間資源,

如下圖所示: 

而線程池創(chuàng)建了線程之后就會(huì)放在線程池中,因此線程池相比于線程來(lái)說(shuō),第一個(gè)優(yōu)點(diǎn)就是可以復(fù)用線程、減低系統(tǒng)資源的消耗

優(yōu)點(diǎn)2:提高響應(yīng)速度

線程池是復(fù)用已有線程來(lái)執(zhí)行任務(wù)的,而線程是在有任務(wù)時(shí)才新建的,所以相比于線程來(lái)說(shuō),線程池能夠更快的響應(yīng)任務(wù)和執(zhí)行任務(wù)。

優(yōu)點(diǎn)3:管控線程數(shù)和任務(wù)數(shù)

線程池提供了更多的管理功能,這里管理功能主要體現(xiàn)在以下兩個(gè)方面:

  • 控制最大并發(fā)數(shù):線程池可以創(chuàng)建固定的線程數(shù),從而避免了無(wú)限創(chuàng)建線程的問(wèn)題。當(dāng)線程創(chuàng)建過(guò)多時(shí),會(huì)導(dǎo)致系統(tǒng)執(zhí)行變慢,因?yàn)?CPU 核數(shù)是一定的、能同時(shí)處理的任務(wù)數(shù)也是一定的,而線程過(guò)多時(shí)就會(huì)造成線程惡意爭(zhēng)搶和線程頻繁切換的問(wèn)題,從而導(dǎo)致程序執(zhí)行變慢,所以合適的線程數(shù)才是高性能運(yùn)行的關(guān)鍵。
  • 控制任務(wù)最大數(shù):如果任務(wù)無(wú)限多,而內(nèi)存又不足的情況下,就會(huì)導(dǎo)致程序執(zhí)行報(bào)錯(cuò),而線程池可以控制最大任務(wù)數(shù),當(dāng)任務(wù)超過(guò)一定數(shù)量之后,就會(huì)采用拒絕策略來(lái)處理多出的任務(wù),從而保證了系統(tǒng)可以健康的運(yùn)行。

優(yōu)點(diǎn)4:更多增強(qiáng)功能

線程池相比于線程來(lái)說(shuō)提供了更多的功能,比如定時(shí)執(zhí)行和周期執(zhí)行等功能。

總結(jié)

池化技術(shù)指的是提前準(zhǔn)備一些資源,在需要時(shí)可以重復(fù)使用這些預(yù)先準(zhǔn)備的資源。

池化技術(shù)的優(yōu)點(diǎn)主要有兩個(gè):

  • 提前準(zhǔn)備和重復(fù)利用。
  • 線程池是池化技術(shù)的典型場(chǎng)景,

線程池的優(yōu)點(diǎn)主要有 4 點(diǎn):

  • 1.復(fù)用線程,降低了資源消耗;
  • 2.提高響應(yīng)速度;
  • 3.提供了管理線程數(shù)和任務(wù)數(shù)的能力;
  • 4.更多增強(qiáng)功能。?

到此這篇關(guān)于Java線程池的優(yōu)點(diǎn)及池化技術(shù)的應(yīng)用的文章就介紹到這了,更多相關(guān)Java池化技術(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計(jì)模式之java組合模式詳解

    Java設(shè)計(jì)模式之java組合模式詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之組合模式,簡(jiǎn)單說(shuō)明了組合模式的原理,并結(jié)合實(shí)例分析了java組合模式的具體用法,需要的朋友可以參考下
    2021-09-09
  • Java14發(fā)布了,再也不怕NullPointerException了

    Java14發(fā)布了,再也不怕NullPointerException了

    這篇文章主要介紹了Java14發(fā)布了,再也不怕NullPointerException了,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享

    Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享

    這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 使用filebeat收集并解析springboot日志過(guò)程示例

    使用filebeat收集并解析springboot日志過(guò)程示例

    這篇文章主要為大家介紹了使用filebeat收集并解析springboot日志實(shí)現(xiàn)過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • java設(shè)計(jì)模式系列之裝飾者模式

    java設(shè)計(jì)模式系列之裝飾者模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下
    2016-02-02
  • springboot?jpa之返回表中部分字段的處理詳解

    springboot?jpa之返回表中部分字段的處理詳解

    這篇文章主要介紹了springboot?jpa之返回表中部分字段的處理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java多線程tryLock()方法使用

    詳解Java多線程tryLock()方法使用

    本文主要介紹了Java多線程tryLock()方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 帶你了解Java的類和對(duì)象

    帶你了解Java的類和對(duì)象

    下面小編就為大家?guī)?lái)一篇全面理解Java類和對(duì)象。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • 為什么 Java 8 中不需要 StringBuilder 拼接字符串

    為什么 Java 8 中不需要 StringBuilder 拼接字符串

    java8中,編輯器對(duì)“+”進(jìn)行了優(yōu)化,默認(rèn)使用StringBuilder進(jìn)行拼接,所以不用顯示的使用StringBuilder了,直接用“+”就可以了。下面我們來(lái)詳細(xì)了解一下
    2019-05-05
  • springboot使用注解獲取yml配置的兩種方法

    springboot使用注解獲取yml配置的兩種方法

    本文主要介紹了springboot使用注解獲取yml配置的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評(píng)論