<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          問一下,線程池里面到底該設(shè)置多少個線程?

          共 1450字,需瀏覽 3分鐘

           ·

          2020-08-09 21:10

          ? ? ?

          ? ?正文? ?


          一、拋出問題

          關(guān)于如何計算并發(fā)線程數(shù),一般分兩派,來自兩本書,且都是好書,到底哪個是對的?問題追蹤后,整理如下:

          第一派:《Java Concurrency in Practice》即《java并發(fā)編程實踐》,如下圖:

          如上圖,在《Java Concurrency in Practice》一書中,給出了估算線程池大小的公式:

          Nthreads=NcpuUcpu(1+w/c),其中

          Ncpu=CPU核心數(shù)

          Ucpu=cpu使用率,0~1

          W/C=等待時間與計算時間的比率


          第二派:《Programming Concurrency on the JVM Mastering》即《Java 虛擬機并發(fā)編程》

          線程數(shù)=Ncpu/(1-阻塞系數(shù))

          二、分析

          對于派系一,假設(shè)cpu100%運轉(zhuǎn),即撇開CPU使用率這個因素,線程數(shù)=Ncpu*(1+w/c)。

          現(xiàn)在假設(shè)將派系二的公式等于派系一公式,即Ncpu/(1-阻塞系數(shù))=Ncpu*(1+w/c),===》阻塞系數(shù)=w/(w+c),即阻塞系數(shù)=阻塞時間/(阻塞時間+計算時間),這個結(jié)論在派系二后續(xù)中得到應(yīng)征,如下圖:

          由此可見,派系一和派系二其實是一個公式……這樣我就放心了……

          三、實際應(yīng)用

          那么實際使用中并發(fā)線程數(shù)如何設(shè)置呢?分析如下(我們以派系一公式為例):

          Nthreads=Ncpu*(1+w/c)

          IO密集型:一般情況下,如果存在IO,那么肯定w/c>1(阻塞耗時一般都是計算耗時的很多倍),但是需要考慮系統(tǒng)內(nèi)存有限(每開啟一個線程都需要內(nèi)存空間),這里需要上服務(wù)器測試具體多少個線程數(shù)適合(CPU占比、線程數(shù)、總耗時、內(nèi)存消耗)。如果不想去測試,保守點取1即,Nthreads=Ncpu*(1+1)=2Ncpu。這樣設(shè)置一般都OK。擴展一下:JAVA多線程和并發(fā)基礎(chǔ)面試問答

          計算密集型:假設(shè)沒有等待w=0,則W/C=0. Nthreads=Ncpu。

          至此結(jié)論就是:

          IO密集型=2Ncpu(可以測試后自己控制大小,2Ncpu一般沒問題)(常出現(xiàn)于線程中:數(shù)據(jù)庫數(shù)據(jù)交互、文件上傳下載、網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)鹊龋?/p>

          計算密集型=Ncpu(常出現(xiàn)于線程中:復(fù)雜算法)

          java中:Ncpu=Runtime.getRuntime().availableProcessors()


          當(dāng)然派系一種《Java Concurrency in Practice》還有一種說法,

          即對于計算密集型的任務(wù),在擁有N個處理器的系統(tǒng)上,當(dāng)線程池的大小為N+1時,通常能實現(xiàn)最優(yōu)的效率。(即使當(dāng)計算密集型的線程偶爾由于缺失故障或者其他原因而暫停時,這個額外的線程也能確保CPU的時鐘周期不會被浪費。)

          即,計算密集型=Ncpu+1,但是這種做法導(dǎo)致的多一個cpu上下文切換是否值得,這里不考慮。讀者可自己考量。

          四、總結(jié):

          選擇線程池并發(fā)線程數(shù)的因素很多:任務(wù)類型、內(nèi)存等線程中使用到所有資源都需要考慮。



          源:https://www.cnblogs.com/dennyzhangdd/p/6909771.html

          版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認,我們都會標明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!



          感謝閱讀



          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  污视频毛片 | 狠狠操成人免费黄色视频 | 天堂网8 天堂最新 | 青青视频偷拍 | 日韩AV无码一区二区三 |