偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

假如我是一個(gè)線(xiàn)程池

開(kāi)發(fā) 前端
我是一個(gè)線(xiàn)程池(ThreadPoolExecutor),我的主要工作是管理在我這的多個(gè)線(xiàn)程(Thread),讓他們能并發(fā)地執(zhí)行多個(gè)任務(wù)的同時(shí),又不會(huì)造成很大的的系統(tǒng)開(kāi)銷(xiāo),有人不明白,創(chuàng)建線(xiàn)程有啥開(kāi)銷(xiāo)呢,不是只要 new 一個(gè) Thread 出來(lái)讓它跑就行了嗎?

[[348770]]

線(xiàn)程池的自我介紹

我是一個(gè)線(xiàn)程池(ThreadPoolExecutor),我的主要工作是管理在我這的多個(gè)線(xiàn)程(Thread),讓他們能并發(fā)地執(zhí)行多個(gè)任務(wù)的同時(shí),又不會(huì)造成很大的的系統(tǒng)開(kāi)銷(xiāo),有人不明白,創(chuàng)建線(xiàn)程有啥開(kāi)銷(xiāo)呢,不是只要 new 一個(gè) Thread 出來(lái)讓它跑就行了嗎,這里我要簡(jiǎn)單解釋下:

  1. 其實(shí) Java 中的線(xiàn)程模型是基于操作系統(tǒng)原生線(xiàn)程模型實(shí)現(xiàn)的,也就是說(shuō) Java 中的線(xiàn)程其實(shí)是基于內(nèi)核線(xiàn)程實(shí)現(xiàn)的,線(xiàn)程的創(chuàng)建,析構(gòu)與同步都需要進(jìn)行系統(tǒng)調(diào)用,而系統(tǒng)調(diào)用需要在用戶(hù)態(tài)與內(nèi)核中來(lái)回切換,代價(jià)相對(duì)較高,線(xiàn)程的生命周期包括「線(xiàn)程創(chuàng)建時(shí)間」,「線(xiàn)程執(zhí)行任務(wù)時(shí)間」,「線(xiàn)程銷(xiāo)毀時(shí)間」,創(chuàng)建和銷(xiāo)毀都需要導(dǎo)致系統(tǒng)調(diào)用。
  2. 每個(gè) Thread 都需要有一個(gè)內(nèi)核線(xiàn)程的支持,也就意味著每個(gè) Thread 都需要消耗一定的內(nèi)核資源(如內(nèi)核線(xiàn)程的棧空間),因?yàn)槟軇?chuàng)建的 Thread 是有限的,默認(rèn)一個(gè)線(xiàn)程的線(xiàn)程棧大小是 1 M,如果每來(lái)一個(gè)任務(wù)就創(chuàng)建線(xiàn)程的話(huà),1024 個(gè)任務(wù)就光創(chuàng)建線(xiàn)程就占用了 1 G 內(nèi)存,很容易就系統(tǒng)崩潰了。

corePoolSize

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

「線(xiàn)程池,這是我的一個(gè)任務(wù),幫我執(zhí)行一下吧」,主線(xiàn)程丟給我任務(wù)后立馬返回,于是我趕緊調(diào)用 execute 方法來(lái)處理丟給我的這個(gè)任務(wù)(Runnable)

  1. public interface Executor { 
  2.     void execute(Runnable command); 

由于我誕生后還沒(méi)有執(zhí)行過(guò)任務(wù),核心線(xiàn)程一直為 0,于是在這個(gè)方法里我創(chuàng)建了一個(gè)線(xiàn)程作為核心線(xiàn)程。

「線(xiàn)程池,任務(wù)又來(lái)了,幫我執(zhí)行一下吧」,又來(lái)任務(wù)了!于是我再次調(diào)用了 execute,又創(chuàng)建了一個(gè)核心線(xiàn)程,此時(shí)核心線(xiàn)程數(shù)為 2。

過(guò)了一段時(shí)間,第一個(gè)核心線(xiàn)程已經(jīng)執(zhí)行完任務(wù),空閑出來(lái)了,此時(shí)任務(wù)又來(lái)了。。。

「線(xiàn)程池,這是我的一個(gè)任務(wù),幫我執(zhí)行一下吧」主線(xiàn)程摞下一句話(huà)后又走了,此時(shí)是 1 個(gè)核心線(xiàn)程在忙碌,一個(gè)核心線(xiàn)程空閑,可能很多人誤以為這里既然有一個(gè)核心線(xiàn)程在空閑,那就把任務(wù)交給這個(gè)線(xiàn)程處理即可,不用再創(chuàng)建核心線(xiàn)程了,但實(shí)際上只要當(dāng)前核心線(xiàn)程數(shù)少于當(dāng)初設(shè)置的 corePoolSize,不管當(dāng)前核心線(xiàn)程是否空閑,我依然會(huì)再創(chuàng)建一個(gè)核心線(xiàn)程,主要是為了保證核心線(xiàn)程盡快達(dá)到我們?cè)O(shè)置的數(shù)量,這樣如果之后有很多任務(wù)涌進(jìn)來(lái),這些已創(chuàng)建好的核心線(xiàn)程就可以馬上準(zhǔn)備好處理這些任務(wù)了,不需要再經(jīng)過(guò)創(chuàng)建線(xiàn)程這種耗時(shí)的操作了。

經(jīng)過(guò)上面的一番操作,核心線(xiàn)程數(shù)來(lái)到了最開(kāi)始設(shè)置的數(shù)量 3 了。

workQueue

「線(xiàn)程池,任務(wù)又來(lái)了,幫我執(zhí)行一下吧」,熟悉的聲音又來(lái)了,此時(shí)核心線(xiàn)程已經(jīng)達(dá)到了我們?cè)O(shè)置的數(shù)量 3 個(gè)了,再創(chuàng)建線(xiàn)程當(dāng)然可以,但又要造成一個(gè)系統(tǒng)調(diào)用,開(kāi)銷(xiāo)比較大,其實(shí)核心線(xiàn)程可能經(jīng)過(guò)很短的時(shí)間又能馬上空閑出來(lái)了,不如把任務(wù)放到放到一個(gè)隊(duì)列里,讓這些核心線(xiàn)程自己去取。

 

聰明的你一定發(fā)現(xiàn)了,這就是典型的生產(chǎn)者-消費(fèi)者模型,線(xiàn)程池中的線(xiàn)程只要不斷循環(huán)去 workQueue 隊(duì)列獲取任務(wù)即可,為了避免 workQueue 為空線(xiàn)程一直輪詢(xún)導(dǎo)致的 CPU 資源被占用的問(wèn)題,這里的 workQueue 采用了阻塞隊(duì)列,所謂阻塞是指,如果 workQueue 為空,則獲取元素的線(xiàn)程會(huì)等待隊(duì)列變?yōu)榉强?,一旦有新的任?wù)入隊(duì)列,會(huì)喚醒等待中的線(xiàn)程。

畫(huà)外音:線(xiàn)程等待是指調(diào)用 LockSupport.park 將線(xiàn)程從運(yùn)行態(tài)變?yōu)樽枞麘B(tài),此時(shí)線(xiàn)程就不占用 CPU 資源了

可是好景不長(zhǎng), JVM 老大向我反饋出現(xiàn) OOM 問(wèn)題了,一看問(wèn)題我就明白了,原來(lái)是哪個(gè)新手程序員在創(chuàng)建我的時(shí)候,聲明使用了無(wú)界隊(duì)列,導(dǎo)致核心線(xiàn)程無(wú)法及時(shí)處理任務(wù),而任務(wù)又源源不斷地添加進(jìn)了 workQueue 中(即生產(chǎn)任務(wù)速度遠(yuǎn)大于消費(fèi)任務(wù)速度),導(dǎo)致 workQueue 越來(lái)越大,最終產(chǎn)生了 OOM!

解決方式很簡(jiǎn)單,使用有界隊(duì)列即可,這樣當(dāng) workQueue 滿(mǎn)時(shí)就無(wú)法添加任務(wù)了,不會(huì)導(dǎo)致 workQueue 無(wú)限增大導(dǎo)致 OOM。

畫(huà)外音:所謂有界隊(duì)列是指設(shè)定了固定大小的隊(duì)列,當(dāng)隊(duì)列里的元素超過(guò)這個(gè)大小后就再也不能往這個(gè)隊(duì)列里塞任務(wù)了,而無(wú)界隊(duì)列由于沒(méi)有設(shè)置固定大小 ,可以直接入隊(duì),直到溢出,容易造成 OOM,所以創(chuàng)建線(xiàn)程池時(shí)應(yīng)該盡量使用有界隊(duì)列

maximumPoolSize

將 workQueue 改用有界隊(duì)列后,再也沒(méi)出現(xiàn)過(guò) OOM 了,不過(guò)由于主線(xiàn)程又源源不斷地丟了一些耗時(shí)的任務(wù)過(guò)來(lái),核心線(xiàn)程依然處理不過(guò)來(lái),workQueue 很快又滿(mǎn)了,這時(shí)我想起了另一個(gè)參數(shù) maximumPoolSize,這個(gè)參數(shù)定義了我能創(chuàng)建的最大線(xiàn)程數(shù),當(dāng)其它線(xiàn)程要往隊(duì)列塞任務(wù),但發(fā)現(xiàn) workQueue 滿(mǎn)時(shí),由于當(dāng)前在我這的線(xiàn)程還未到達(dá) maximumPoolSize(假設(shè)起初指定為 5),所以我又創(chuàng)建了線(xiàn)程來(lái)處理這個(gè)任務(wù)。

畫(huà)外音: 在 workQueue 已滿(mǎn)的條件下,如果當(dāng)前線(xiàn)程池的線(xiàn)程數(shù)量 >= corePoolSize 且 <= maximumPoolSize,后續(xù)如果一直有其它線(xiàn)程丟任務(wù)進(jìn)來(lái),會(huì)一直創(chuàng)建線(xiàn)程,直到 maximumPoolSize。

RejectedExecutionHandler

某天,往我這丟任務(wù)的某個(gè)線(xiàn)程反饋收到異常了,我一看,我靠,workQueue 滿(mǎn)了,線(xiàn)程數(shù)也達(dá)到了 maximumPoolSize,但此時(shí)依然有任務(wù)不斷往 workQueue 中插,但這種情況下已經(jīng)超出了我的處理能力了,只好執(zhí)行默認(rèn)的拒絕策略,拋出 RejectedExecutionException 異常讓其他線(xiàn)程(往我這丟任務(wù)的線(xiàn)程)自己處理。

畫(huà)外音:線(xiàn)程池提供了 AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy,自定義這五種拒絕策略,默認(rèn)是 AbortPolicy

keepAliveTime

在線(xiàn)程們的努力之下,workQueue 隊(duì)列中的任務(wù)很快被清空了,很長(zhǎng)一段時(shí)間都沒(méi)有任務(wù)進(jìn)來(lái)了,線(xiàn)程們很快就無(wú)事可做,放著又占用資源,該怎么處理呢?此時(shí)我這有核心線(xiàn)程 3(corePoolSize = 3), 額外線(xiàn)程 2 (maximumPoolSize 為 5),

我是這么處理的,如果當(dāng)前線(xiàn)程總數(shù)超過(guò)了 corePoolSize,在 keepAliveTime 這個(gè)時(shí)間內(nèi),如果池子里的線(xiàn)程一直空閑,就把這個(gè)線(xiàn)程給干掉,哪個(gè)線(xiàn)程空閑時(shí)間先到達(dá) keepAliveTime,就干掉哪個(gè),直到線(xiàn)程數(shù)減少到 corePoolSize。

畫(huà)外音:線(xiàn)程池里沒(méi)有核心線(xiàn)程和額外線(xiàn)程之分,只是為了講述方便人為劃分了一下,但其實(shí)線(xiàn)程池里的線(xiàn)程都是平等的,任何一個(gè)線(xiàn)程都可以被干掉

本文轉(zhuǎn)載自微信公眾號(hào)「碼?!?,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼海公眾號(hào)。

 

 

責(zé)任編輯:武曉燕 來(lái)源: 碼海
相關(guān)推薦

2020-04-20 09:02:33

函數(shù)RPCCPU

2019-03-28 10:09:49

內(nèi)存CPU硬盤(pán)

2018-06-15 16:17:08

2023-03-03 21:25:28

馬斯克特斯拉

2022-11-02 09:53:54

架構(gòu)核酸

2022-03-09 09:43:01

工具類(lèi)線(xiàn)程項(xiàng)目

2020-04-09 09:02:38

bug編程代碼

2022-03-07 05:53:41

線(xiàn)程CPU代碼

2021-03-29 08:47:24

線(xiàn)程面試官線(xiàn)程池

2021-10-27 06:49:34

線(xiàn)程池Core函數(shù)

2023-03-08 07:43:07

DUCC配置平臺(tái)

2022-05-19 14:49:19

Nick網(wǎng)絡(luò)開(kāi)源社區(qū)專(zhuān)有網(wǎng)絡(luò)

2016-12-15 08:54:52

線(xiàn)程sessionopenSession

2022-02-10 11:43:54

DUBBO線(xiàn)程池QPS

2021-04-18 07:12:08

Dubbo線(xiàn)程池

2022-12-30 08:29:07

Nacos動(dòng)態(tài)化線(xiàn)程池

2012-11-01 13:41:25

編程語(yǔ)言BasicPerl

2024-02-04 09:19:00

Nacos動(dòng)態(tài)化線(xiàn)程池

2024-11-08 14:11:09

2018-12-18 09:54:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)