前言
最近發現很多小夥伴對於Java
線程池ThreadPoolExecutor
的原理不是特別的理解,所以想通過這篇文章來讓大家更好的認識線程池的原理,瞭解到其是如何工作的?
講解
下面我會將線程池比作一個公司的一個部門,介紹線程池如何工作的,同時介紹其中的一些關鍵組件和參數。
ThreadFactory
一天,某家公司由於業務發展需要,準備建立一個新的部門。由於這個部門的業務公司裏是沒有一個人接觸過,準備招聘一批人來幹這個活。
但是這個招人肯定會對人才有要求吧,所以就需要HR
來把關了,通過HR
來控制入職的人員的素質。(這裏把員工比作線程,HR
比作ThreadFactory
,實際上線程是由ThreadFactory
創建的)
corePoolSize
既然上面都提到招人了,那當然不可能無限招人,這個崗位是有上限(corePoolSize
是核心線程池的大小,而這裏是比作核心員工的上限,畢竟核心員工不會隨便解僱)。
需要注意,線程池實際工作是會在當前沒有空閒的核心線程時,且當前核心線程數沒有達到上限corePoolSize
時,直接創建一個新的核心線程。
maximumPoolSize
隨着工作的開展,核心員工逐漸招滿人了。可是偶爾也會出現工作太大,核心員工工作無法按期完成的情況。
於是老闆靈機一動,乾脆招一批外包吧。就讓HR
來把關這批外包的素質。
而核心員工數+外包員工數=部門總人數(maximumPoolSize
是線程池的大小,這裏比作部門總人數)。
這裏需要注意,既然都是HR
把關的人,也就是說線程都會由ThreadFactory
創建的。
keepAliveTime和unit
既然招聘的是外包,那當然有聘期(keepAliveTime
指的是線程存活時間,這裏比作外包的聘期)了,而且聘期肯定是有時間單位(unit
指的是線程存活時間的時間單位)。
workQueue
HR
好不容易招滿了外包,可是部門的人卻發現工作的確是做不完啊,怎麼辦呢?
只好是把任務排期了(workQueue
指的是阻塞隊列BlockingQueue
對象,這裏比作任務排期),如果誰狀態好可以從排期的任務中把任務提前做了。
handler
但是部門的人排期後發現,工作實在太多了,排期都排到要天天加班才能搞定。
於是部門的人乾脆向領導投訴了,拒絕這麼多工作,至於怎麼拒絕就得看他們怎麼做了(handler
指的是拒絕執行處理器RejectedExecutionHandler
,只有當線程池每個線程都在工作中,且BlockingQueue
達到上限纔會觸發。)
allowCoreThreadTimeOut
某一天老闆想不開,覺得這個部門的員工沒必要留,可是部門的業務還有賺錢的。
於是他靈機一動,爲什麼不整個部門都招外包來幹活呢?
於是整個部門都是外包了,工作不忙時就可以很方便的減少人員了。(allowCoreThreadTimeOut
是設置核心線程是否允許超時的標誌位,默認爲false
即核心線程不允許超時回收,而設置爲true
時,核心線程如果在一定時間內keepAliveTime
無任務處理就會觸發超時回收)