通俗易懂的Java線程池原理

前言

最近發現很多小夥伴對於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無任務處理就會觸發超時回收)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章