1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          線程池的工作原理(線程池的工作原理是什么)

          來源:互聯網轉載 時間:2024-05-03 15:46:15

          線程池的自我介紹

          我是一個線程池(ThreadPoolExecutor),我的主要工作是管理在我這的多個線程(Thread),讓他們能并發地執行多個任務的同時,又不會造成很大的的系統開銷,有人不明白,創建線程有啥開銷呢,不是只要 new 一個 Thread 出來讓它跑就行了嗎,這里我要簡單解釋下:

          1. 其實 Java 中的線程模型是基于操作系統原生線程模型實現的,也就是說 Java 中的線程其實是基于內核線程實現的,線程的創建,析構與同步都需要進行系統調用,而系統調用需要在用戶態與內核中來回切換,代價相對較高,線程的生命周期包括「線程創建時間」,「線程執行任務時間」,「線程銷毀時間」,創建和銷毀都需要導致系統調用。

          2. 每個 Thread 都需要有一個內核線程的支持,也就意味著每個 Thread 都需要消耗一定的內核資源(如內核線程的??臻g),因為能創建的 Thread 是有限的,默認一個線程的線程棧大小是 1 M,如果每來一個任務就創建線程的話,1024 個任務就光創建線程就占用了 1 G 內存,很容易就系統崩潰了。

          corePoolSize

          所以我的主要作用就是減少線程的創建時間和銷毀時間,線程創建后不讓它馬上銷毀,而是常駐在我這,隨叫隨到,我把這些常駐的線程叫做核心線程,核心線程數也不宜過多,所以我指定了它們的數量(corePoolSize),假定為 3 吧。

          「線程池,這是我的一個任務,幫我執行一下吧」,主線程丟給我任務后立馬返回,于是我趕緊調用 execute 方法來處理丟給我的這個任務(Runnable)

          publicinterfaceExecutor{voidexecute(Runnablecommand);}

          由于我誕生后還沒有執行過任務,核心線程一直為 0,于是在這個方法里我創建了一個線程作為核心線程。

          「線程池,任務又來了,幫我執行一下吧」,又來任務了!于是我再次調用了 execute,又創建了一個核心線程,此時核心線程數為 2。

          過了一段時間,第一個核心線程已經執行完任務,空閑出來了,此時任務又來了。。。

          「線程池,這是我的一個任務,幫我執行一下吧」主線程摞下一句話后又走了,此時是 1 個核心線程在忙碌,一個核心線程空閑,可能很多人誤以為這里既然有一個核心線程在空閑,那就把任務交給這個線程處理即可,不用再創建核心線程了,但實際上只要當前核心線程數少于當初設置的 corePoolSize,不管當前核心線程是否空閑,我依然會再創建一個核心線程,主要是為了保證核心線程盡快達到我們設置的數量,這樣如果之后有很多任務涌進來,這些已創建好的核心線程就可以馬上準備好處理這些任務了,不需要再經過創建線程這種耗時的操作了。

          經過上面的一番操作,核心線程數來到了最開始設置的數量 3 了。

          workQueue

          「線程池,任務又來了,幫我執行一下吧」,熟悉的聲音又來了,此時核心線程已經達到了我們設置的數量 3 個了,再創建線程當然可以,但又要造成一個系統調用,開銷比較大,其實核心線程可能經過很短的時間又能馬上空閑出來了,不如把任務放到放到一個隊列里,讓這些核心線程自己去取。

          聰明的你一定發現了,這就是典型的生產者-消費者模型,線程池中的線程只要不斷循環去 workQueue 隊列獲取任務即可,為了避免 workQueue 為空線程一直輪詢導致的 CPU 資源被占用的問題,這里的 workQueue 采用了阻塞隊列,所謂阻塞是指,如果 workQueue 為空,則獲取元素的線程會等待隊列變為非空,一旦有新的任務入隊列,會喚醒等待中的線程。

          畫外音:線程等待是指調用 LockSupport.park 將線程從運行態變為阻塞態,此時線程就不占用 CPU 資源了

          可是好景不長, JVM 老大向我反饋出現 OOM 問題了,一看問題我就明白了,原來是哪個新手程序員在創建我的時候,聲明使用了無界隊列,導致核心線程無法及時處理任務,而任務又源源不斷地添加進了 workQueue 中(即生產任務速度遠大于消費任務速度),導致 workQueue 越來越大,最終產生了 OOM!

          解決方式很簡單,使用有界隊列即可,這樣當 workQueue 滿時就無法添加任務了,不會導致 workQueue 無限增大導致 OOM。

          畫外音:所謂有界隊列是指設定了固定大小的隊列,當隊列里的元素超過這個大小后就再也不能往這個隊列里塞任務了,而無界隊列由于沒有設置固定大小 ,可以直接入隊,直到溢出,容易造成 OOM,所以創建線程池時應該盡量使用有界隊列

          maximumPoolSize

          將 workQueue 改用有界隊列后,再也沒出現過 OOM 了,不過由于主線程又源源不斷地丟了一些耗時的任務過來,核心線程依然處理不過來,workQueue 很快又滿了,這時我想起了另一個參數 maximumPoolSize,這個參數定義了我能創建的最大線程數,當其它線程要往隊列塞任務,但發現 workQueue 滿時,由于當前在我這的線程還未到達 maximumPoolSize(假設起初指定為 5),所以我又創建了線程來處理這個任務。

          畫外音: 在 workQueue 已滿的條件下,如果當前線程池的線程數量 >= corePoolSize 且 <= maximumPoolSize,后續如果一直有其它線程丟任務進來,會一直創建線程,直到 maximumPoolSize。

          RejectedExecutionHandler

          某天,往我這丟任務的某個線程反饋收到異常了,我一看,我靠,workQueue 滿了,線程數也達到了 maximumPoolSize,但此時依然有任務不斷往 workQueue 中插,但這種情況下已經超出了我的處理能力了,只好執行默認的拒絕策略,拋出 RejectedExecutionException 異常讓其他線程(往我這丟任務的線程)自己處理。

          畫外音:線程池提供了 AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy,自定義這五種拒絕策略,默認是 AbortPolicy

          keepAliveTime

          在線程們的努力之下,workQueue 隊列中的任務很快被清空了,很長一段時間都沒有任務進來了,線程們很快就無事可做,放著又占用資源,該怎么處理呢?此時我這有核心線程 3(corePoolSize = 3), 額外線程 2 (maximumPoolSize 為 5),

          我是這么處理的,如果當前線程總數超過了 corePoolSize,在 keepAliveTime 這個時間內,如果池子里的線程一直空閑,就把這個線程給干掉,哪個線程空閑時間先到達 keepAliveTime,就干掉哪個,直到線程數減少到 corePoolSize。

          畫外音:線程池里沒有核心線程和額外線程之分,只是為了講述方便人為劃分了一下,但其實線程池里的線程都是平等的,任何一個線程都可以被干掉

          感謝各位的閱讀,以上就是“線程池的工作原理是什么”的內容了,經過本文的學習后,相信大家對線程池的工作原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是本站,小編將為大家推送更多相關知識點的文章,歡迎關注!

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          (資料圖片僅供參考)哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到求夫妻雙重生或雙穿越溫馨甜文~方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于求夫妻雙重生或雙穿越溫馨甜文~的相關內容。1、《親愛的愛情》, 作者:蘭芝。2、《穿越之女配逆襲記》,作者:呆萌呆萌。3、《穿越女重生后的逆襲》,作者:鳳棲桐。4、《重生之干物女的逆襲》,作者:櫻華。5...

          2018年股市為什么大跌?2018年12月28日是2018年a股的最后一個交易日。這一年,a股相當跌宕起伏。對于投資者來說,他們度過了悲傷的2018年,但對于一些企業來說,他們度過了悲慘的2018年。2018的股市已經讓人走的很艱難了。a股三大指數今年以來跌幅均超過20%,而個股情況更為慘烈。根據相關統計可以知道,2018年中,除了股價遭遇腰斬,還有3200多只股票收跌,共有503只股票跌幅超過5...

          (資料圖)最近這段時間總有小伙伴問小編法醫秦明第一部結局是什么,小編為此在網上搜尋了一些有關于法醫秦明第一部結局的知識送給大家,希望能解答各位小伙伴的疑惑?!斗ㄡt秦明》第一部的結局:林濤和秦明一起救出了大寶。當新的命案發生時,鐵三角再度整裝待發,一起前往命案現場,為每一個死者查明真相,找出幕后真兇?!斗ㄡt秦明》是一部懸疑偵案劇,由徐昂執導,張若昀、李現、焦俊艷主演。該劇改編自秦明的文學作品《第十一...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>