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