Java線程池七個參數詳解

java多線程開發時,常常用到線程池技術,這篇文章是對創建java線程池時的七個參數的詳細解釋。

從源碼中可以看出,線程池的構造函數有7個參數,分別是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面會對這7個參數一一解釋。

一、corePoolSize 線程池核心線程大小

線程池中會維護一個最小的線程數量,即使這些線程處理空閒狀態,他們也不會 被銷燬,除非設置了allowCoreThreadTimeOut。這裏的最小線程數量即是corePoolSize。

二、maximumPoolSize 線程池最大線程數量

一個任務被提交到線程池後,首先會緩存到工作隊列(後面會介紹)中,如果工作隊列滿了,則會創建一個新線程,然後從工作隊列中的取出一個任務交由新線程來處理,再將剛提交的任務放入工作隊列。線程池不會無限制的去創建新線程,它會有一個最大線程數量的限制,這個數量即由maximunPoolSize來指定。

三、keepAliveTime 空閒線程存活時間

一個線程如果處於空閒狀態,並且當前的線程數量大於corePoolSize,那麼在指定時間後,這個空閒線程會被銷燬,這裏的指定時間由keepAliveTime來設定

四、unit 空間線程存活時間單位

keepAliveTime的計量單位

五、workQueue 工作隊列

新任務被提交後,會先進入到此工作隊列中,任務調度時再從隊列中取出任務。jdk中提供了四種工作隊列:

①ArrayBlockingQueue

基於數組的有界阻塞隊列,按FIFO排序。新任務進來後,會放到該隊列的隊尾,有界的數組可以防止資源耗盡問題。當線程池中線程數量達到corePoolSize後,再有新任務進來,則會將任務放入該隊列的隊尾,等待被調度。如果隊列已經是滿的,則創建一個新線程,如果線程數量已經達到maxPoolSize,則會執行拒絕策略。

②LinkedBlockingQuene

基於鏈表的無界阻塞隊列(其實最大容量爲Interger.MAX),按照FIFO排序。由於該隊列的近似無界性,當線程池中線程數量達到corePoolSize後,再有新任務進來,會一直存入該隊列,而不會去創建新線程直到maxPoolSize,因此使用該工作隊列時,參數maxPoolSize其實是不起作用的。

③SynchronousQuene

一個不緩存任務的阻塞隊列,生產者放入一個任務必須等到消費者取出這個任務。也就是說新任務進來時,不會緩存,而是直接被調度執行該任務,如果沒有可用線程,則創建新線程,如果線程數量達到maxPoolSize,則執行拒絕策略。

④PriorityBlockingQueue

具有優先級的無界阻塞隊列,優先級通過參數Comparator實現。

六、threadFactory 線程工廠

創建一個新線程時使用的工廠,可以用來設定線程名、是否爲daemon線程等等

七、handler 拒絕策略

當工作隊列中的任務已到達最大限制,並且線程池中的線程數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這裏的拒絕策略,就是解決這個問題的,jdk中提供了4中拒絕策略:

①CallerRunsPolicy

該策略下,在調用者線程中直接執行被拒絕任務的run方法,除非線程池已經shutdown,則直接拋棄任務。

②AbortPolicy

該策略下,直接丟棄任務,並拋出RejectedExecutionException異常。

③DiscardPolicy

該策略下,直接丟棄任務,什麼都不做。

④DiscardOldestPolicy

該策略下,拋棄進入隊列最早的那個任務,然後嘗試把這次拒絕的任務放入隊列

到此,構造線程池時的七個參數,就全部介紹完畢了。

============

ThreadPoolExecutor執行順序    

線程池按以下行爲執行任務
    1. 當線程數小於核心線程數時,創建線程。
    2. 當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。
    3. 當線程數大於等於核心線程數,且任務隊列已滿
        - 若線程數小於最大線程數,創建線程
        - 若線程數等於最大線程數,拋出異常,拒絕任務

 1、默認值
        * corePoolSize=1
        * queueCapacity=Integer.MAX_VALUE
        * maxPoolSize=Integer.MAX_VALUE
        * keepAliveTime=60s
        * allowCoreThreadTimeout=false
        * rejectedExecutionHandler=AbortPolicy()

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