摘要:前言最近發(fā)現(xiàn)很多小伙伴對(duì)于線程池的原理不是特別的理解,所以想通過(guò)這篇文章來(lái)讓大家更好的認(rèn)識(shí)線程池的原理,了解到其是如何工作的講解下面我會(huì)將線程池比作一個(gè)公司的一個(gè)部門(mén),介紹線程池如何工作的,同時(shí)介紹其中的一些關(guān)鍵組件和參數(shù)。
前言
最近發(fā)現(xiàn)很多小伙伴對(duì)于Java線程池ThreadPoolExecutor的原理不是特別的理解,所以想通過(guò)這篇文章來(lái)讓大家更好的認(rèn)識(shí)線程池的原理,了解到其是如何工作的?
講解下面我會(huì)將線程池比作一個(gè)公司的一個(gè)部門(mén),介紹線程池如何工作的,同時(shí)介紹其中的一些關(guān)鍵組件和參數(shù)。
ThreadFactory一天,某家公司由于業(yè)務(wù)發(fā)展需要,準(zhǔn)備建立一個(gè)新的部門(mén)。由于這個(gè)部門(mén)的業(yè)務(wù)公司里是沒(méi)有一個(gè)人接觸過(guò),準(zhǔn)備招聘一批人來(lái)干這個(gè)活。
但是這個(gè)招人肯定會(huì)對(duì)人才有要求吧,所以就需要HR來(lái)把關(guān)了,通過(guò)HR來(lái)控制入職的人員的素質(zhì)。(這里把員工比作線程,HR比作ThreadFactory,實(shí)際上線程是由ThreadFactory創(chuàng)建的)
corePoolSize既然上面都提到招人了,那當(dāng)然不可能無(wú)限招人,這個(gè)崗位是有上限(corePoolSize是核心線程池的大小,而這里是比作核心員工的上限,畢竟核心員工不會(huì)隨便解雇)。
需要注意,線程池實(shí)際工作是會(huì)在當(dāng)前沒(méi)有空閑的核心線程時(shí),且當(dāng)前核心線程數(shù)沒(méi)有達(dá)到上限corePoolSize時(shí),直接創(chuàng)建一個(gè)新的核心線程。
maximumPoolSize隨著工作的開(kāi)展,核心員工逐漸招滿人了。可是偶爾也會(huì)出現(xiàn)工作太大,核心員工工作無(wú)法按期完成的情況。
于是老板靈機(jī)一動(dòng),干脆招一批外包吧。就讓HR來(lái)把關(guān)這批外包的素質(zhì)。
而核心員工數(shù)+外包員工數(shù)=部門(mén)總?cè)藬?shù)(maximumPoolSize是線程池的大小,這里比作部門(mén)總?cè)藬?shù))。
這里需要注意,既然都是HR把關(guān)的人,也就是說(shuō)線程都會(huì)由ThreadFactory創(chuàng)建的。
keepAliveTime和unit既然招聘的是外包,那當(dāng)然有聘期(keepAliveTime指的是線程存活時(shí)間,這里比作外包的聘期)了,而且聘期肯定是有時(shí)間單位(unit指的是線程存活時(shí)間的時(shí)間單位)。
workQueueHR好不容易招滿了外包,可是部門(mén)的人卻發(fā)現(xiàn)工作的確是做不完啊,怎么辦呢?
只好是把任務(wù)排期了(workQueue指的是阻塞隊(duì)列BlockingQueue對(duì)象,這里比作任務(wù)排期),如果誰(shuí)狀態(tài)好可以從排期的任務(wù)中把任務(wù)提前做了。
handler但是部門(mén)的人排期后發(fā)現(xiàn),工作實(shí)在太多了,排期都排到要天天加班才能搞定。
于是部門(mén)的人干脆向領(lǐng)導(dǎo)投訴了,拒絕這么多工作,至于怎么拒絕就得看他們?cè)趺醋隽耍?b>handler指的是拒絕執(zhí)行處理器RejectedExecutionHandler,只有當(dāng)線程池每個(gè)線程都在工作中,且BlockingQueue達(dá)到上限才會(huì)觸發(fā)。)
allowCoreThreadTimeOut某一天老板想不開(kāi),覺(jué)得這個(gè)部門(mén)的員工沒(méi)必要留,可是部門(mén)的業(yè)務(wù)還有賺錢(qián)的。
于是他靈機(jī)一動(dòng),為什么不整個(gè)部門(mén)都招外包來(lái)干活呢?
于是整個(gè)部門(mén)都是外包了,工作不忙時(shí)就可以很方便的減少人員了。(allowCoreThreadTimeOut是設(shè)置核心線程是否允許超時(shí)的標(biāo)志位,默認(rèn)為false即核心線程不允許超時(shí)回收,而設(shè)置為true時(shí),核心線程如果在一定時(shí)間內(nèi)keepAliveTime無(wú)任務(wù)處理就會(huì)觸發(fā)超時(shí)回收)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75115.html
摘要:阿里開(kāi)始招實(shí)習(xí),同學(xué)問(wèn)我要不要去申請(qǐng)阿里的實(shí)習(xí),我說(shuō)不去,個(gè)人對(duì)阿里的印象不好。記得去年阿里給我發(fā)了郵件,我很認(rèn)真地回復(fù),然后他不理我了。 引言 最近好久沒(méi)有遇到技術(shù)瓶頸了,思考得自然少了,每天都是重復(fù)性的工作。 阿里開(kāi)始招實(shí)習(xí),同學(xué)問(wèn)我要不要去申請(qǐng)阿里的實(shí)習(xí),我說(shuō)不去,個(gè)人對(duì)阿里的印象不好。 記得去年阿里給我發(fā)了郵件,我很認(rèn)真地回復(fù),然后他不理我了。(最起碼的尊重都沒(méi)有,就算我菜你起...
摘要:而且,線程池中的線程并沒(méi)有睡眠,而是進(jìn)入了自旋狀態(tài)。普通的線程被中斷會(huì)導(dǎo)致線程繼續(xù)執(zhí)行,從而方法運(yùn)行完畢,線程退出。線程死亡超過(guò)時(shí)間,任務(wù)對(duì)列沒(méi)有數(shù)據(jù)而返回。線程死亡保證了線程池至少留下個(gè)線程。 線程在執(zhí)行任務(wù)時(shí),正常的情況是這樣的: Thread t=new Thread(new Runnable() { @Override ...
摘要:創(chuàng)建線程的方式方式一將類聲明為的子類。將該線程標(biāo)記為守護(hù)線程或用戶線程。其中方法隱含的線程為父線程。恢復(fù)線程,已過(guò)時(shí)。等待該線程銷毀終止。更多的使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線 知識(shí)體系圖: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、線程是什么? 線程是進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)。 2、創(chuàng)建線...
摘要:線程安全的線程安全的,在讀多寫(xiě)少的場(chǎng)合性能非常好,遠(yuǎn)遠(yuǎn)好于高效的并發(fā)隊(duì)列,使用鏈表實(shí)現(xiàn)。這樣帶來(lái)的好處是在高并發(fā)的情況下,你會(huì)需要一個(gè)全局鎖來(lái)保證整個(gè)平衡樹(shù)的線程安全。 該文已加入開(kāi)源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目,Star 數(shù)接近 14 k)。地址:https://github.com/Snailclimb... 一 JDK ...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問(wèn)到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過(guò)的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
閱讀 3106·2021-11-18 10:02
閱讀 2618·2021-10-13 09:47
閱讀 3034·2021-09-22 15:07
閱讀 791·2019-08-30 15:43
閱讀 1810·2019-08-30 10:59
閱讀 1685·2019-08-29 15:34
閱讀 1703·2019-08-29 15:06
閱讀 439·2019-08-29 13:28