續(xù)上篇所述,Java線程池作為jdk組件箱中重要的一員顶瞒,其產(chǎn)生的背后是要來解決一些需求夸政,如線程的管理,任務(wù)的管理榴徐,自身的生命周期的管理等守问。
有了需求,就有了一張藍圖坑资,其描繪了程序最初的樣子酪碘,程序設(shè)計由此便有了依據(jù)。按照古老的 “程序 =?數(shù)據(jù)結(jié)構(gòu)+?算法”?的指揮思想盐茎,我們首先得確定線程池的數(shù)據(jù)結(jié)構(gòu)兴垦。而數(shù)據(jù)結(jié)構(gòu)說白就是數(shù)據(jù)的組織與存儲的方式,就像是好的倉庫管理員對貨物分門別類的放置一樣,我們需要對線程池所管理的數(shù)據(jù)的進行妥當?shù)陌仓谩?/p>
首先探越,我們先明確線程池所管理的核心數(shù)據(jù)有哪些:一組線程及其描述量狡赐,一組任務(wù)及其描述量以及自身的狀態(tài)量(描述自身生命周期)。
我們先講一組線程及其描述量钦幔,線程池要持有一組線程的所有引用枕屉,這些線程得在線程池里創(chuàng)建,但創(chuàng)建的數(shù)量應(yīng)該有一個上限鲤氢,不能無限創(chuàng)建搀擂,故我們需要一個描述量maximumPoolSize來描述線程池能承受的實際最大線程數(shù),另外卷玉,為了進一步細粒度地約束線程池的大小哨颂,避免過多的線程空轉(zhuǎn)閑置,線程池需要另一個描述量corePoolSize來描述久住線程池的最小線程數(shù)相种。綜上威恼,線程池需要一個容器,三個描述量來封裝線程的相關(guān)操作寝并。
接著我們來講一組任務(wù)及其描述量箫措,線程池作為任務(wù)的調(diào)度和分配者,當任務(wù)過多時衬潦,需要一個任務(wù)的緩沖區(qū)來暫存待執(zhí)行的任務(wù)斤蔓,為了了解任務(wù)完成的總體情況,需要一個描述量completedTaskCount來描述當前線程池的完成的任務(wù)總數(shù)镀岛,綜上附迷,線程池需要另外一個容器,一個描述量來封裝任務(wù)的相關(guān)操作哎媚。
最后喇伯,我們講線程池自身的狀態(tài)量,線程池是一個獨立的組件拨与,組件內(nèi)部對調(diào)用者來說是黑盒稻据,雖說是黑盒,也要有一些必要的信息暴露給調(diào)用者买喧,以便調(diào)用者了解并根據(jù)這些信息做出對應(yīng)的決策捻悯。這里就包括RUNNING(正在運行),SHUTDOWN(關(guān)閉)淤毛,STOP(停止)今缚,TIDYING(清理),TERMINATED(結(jié)束)五種狀態(tài)低淡,那為什么需要這五種狀態(tài)姓言,這里就需要聯(lián)系線程池的優(yōu)雅停止處理的考慮瞬项,多出來的SHUTDOWN(關(guān)閉),STOP(停止)何荚,TIDYING(清理)三種中間狀態(tài)能夠更加具體的描述線程池所處的階段囱淋。(后續(xù)會對其擴展講)。
至此餐塘,我描述完了線程池的數(shù)據(jù)結(jié)構(gòu)妥衣,打個比方作為結(jié)束:想像線程池是一個實體的工廠,線程是工廠的員工戒傻,任務(wù)是工廠的加工的原料税手。員工需要工位(容器),員工有正式員工和非正式員工(外包或者臨時工)需纳,正式員工有corePoolSize人芦倒,工廠員工有maximumPoolSize人;原料需要倉庫來暫存(容器)候齿,completedTaskCount描述了原料的消耗量。工廠也有開工闺属,沒工開慌盯,破產(chǎn)清理,倒閉等不同的狀態(tài)掂器。
希望上訴比喻能增強對線程池數(shù)據(jù)結(jié)構(gòu)的理解亚皂。下一篇我們講:
《java線程池算法》