在多線程編程中,我們經常使用線程池來管理線程,以減緩線程頻繁的創建和銷毀帶來的資源的浪費,在創建線程池的時候,經常使用一個工廠類來創建線程池Executors,實際上Executors的內部使用的是類ThreadPoolExecutor。它有一個最終的構造函數如下:
corePoolSize:線程池中的核心線程數量,即使這些線程沒有任務干,也不會將其銷毀。
maximumPoolSize:線程池中的最多能夠創建的線程數量。
keepAliveTime:當線程池中的線程數量大於corePoolSize時,多余的線程等待新任務的最長時間。
unit:keepAliveTime的時間單位。
workQueue:在線程池中的線程還沒有還得及執行任務之前,保存任務的隊列(當線程池中的線程都有任務在執行的時候,仍然有任務不斷的提交過來,這些任務保存在workQueue隊列中)。
threadFactory:創建線程池中線程的工廠。
handler:當線程池中沒有多余的線程來執行任務,並且保存任務的多列也滿了(指的是有界隊列),對仍在提交給線程池的任務的處理策略。
RejectedExecutionHandler 是一個策略接口,用在當線程池中沒有多余的線程來執行任務,並且保存任務的多列也滿了(指的是有界隊列),對仍在提交給線程池的任務的處理策略。
公共策略接口:
這個策略接口有四個實現類:
AbortPolicy:該策略是直接將提交的任務拋棄掉,並拋出RejectedExecutionException異常。
DiscardPolicy:該策略也是將任務拋棄掉(對於提交的任務不管不問,什么也不做),不過並不拋出異常。
DiscardOldestPolicy:該策略是當執行器未關閉時,從任務隊列workQueue中取出第一個任務,並拋棄這第一個任務,進而有空間存儲剛剛提交的任務。使用該策略要特別小心,因為它會直接拋棄之前的任務。
CallerRunsPolicy:該策略並沒有拋棄任何的任務,由於線程池中已經沒有了多余的線程來分配該任務,該策略是在當前線程(調用者線程)中直接執行該任務。
類ThreadPoolExecutor中持有一個RejectedExecutionHandler接口的引用,以便在構造函數中可以由外部客戶端自己制定具體的策略並注入。下面看一下其類圖: