java多執行緒開發時,常常用到執行緒池技術,這篇文章是對建立java執行緒池時的七個參數的詳細解釋。
從原始碼可以看出,執行緒池的建構子有7個參數
這7 個參數分別是:
#corePoolSize:核心執行緒數。
maximumPoolSize:最大執行緒數。
keepAliveTime:空閒執行緒存活時間。
TimeUnit:時間單位。
BlockingQueue:執行緒池任務佇列。
ThreadFactory:建立執行緒的工廠。
RejectedExecutionHandler:拒絕策略。
下面會對這7個參數一一解釋。
執行緒池中會維護一個最小的執行緒數量,即使這些執行緒處理空閒狀態,他們也不會被銷毀,除非設定了allowCoreThreadTimeOut。這裡的最小執行緒數量即是corePoolSize。
一個任務被提交到線程池以後,首先會找有沒有空閒存活線程,如果有則直接將任務交給這個空閒線程來執行,如果沒有則會快取到工作佇列(後面會介紹)中,如果工作佇列滿了,才會建立一個新線程,然後從工作佇列的頭部取出一個任務交由新執行緒來處理,而將剛提交的任務放入工作隊列尾部。線程池不會無限制的去創建新線程,它會有一個最大線程數量的限制,這個數量即由maximunPoolSize指定。
一個執行緒如果處於空閒狀態,且目前的執行緒數大於corePoolSize,那麼在指定時間後,這個空閒執行緒會被銷毀,這裡的指定時間由keepAliveTime來設定
keepAliveTime的計量單位
新任務被提交後,會先進入此工作隊列中,任務調度時再從隊列中取出任務。 jdk中提供了四個工作隊列:
①ArrayBlockingQueue
基於陣列的有界阻塞隊列,按FIFO排序。新任務進來後,會放到該佇列的隊尾,有界的陣列可以防止資源耗盡問題。當執行緒池中執行緒數達到corePoolSize後,再有新任務進來,則會將任務放入該佇列的隊尾,等待被調度。如果佇列已經是滿的,則建立一個新線程,如果線程數量已經達到maxPoolSize,則會執行拒絕策略。
②LinkedBlockingQuene
基於鍊錶的無界阻塞佇列(其實最大容量為Interger.MAX),依照FIFO排序。由於該佇列的近似無界性,當執行緒池中執行緒數量達到corePoolSize後,再有新任務進來,會一直存入該佇列,而不會去建立新執行緒直到maxPoolSize,因此使用該工作佇列時,參數maxPoolSize其實是不起作用的。
③SynchronousQuene
一個不緩存任務的阻塞佇列,生產者放入一個任務必須等到消費者取出這個任務。也就是說新任務進來時,不會緩存,而是直接被調度執行該任務,如果沒有可用線程,則創建新線程,如果線程數量達到maxPoolSize,則執行拒絕策略。
④PriorityBlockingQueue
有優先權的無界阻塞佇列,優先權透過參數Comparator實作。
建立一個新執行緒時使用的工廠,可以用來設定執行緒名、是否為daemon執行緒等等
當工作佇列中的任務已到達最大限制,且執行緒池中的執行緒數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這裡的拒絕策略,就是解決這個問題的,jdk中提供了4中拒絕策略:
①CallerRunsPolicy
該策略下,在呼叫者執行緒中直接執行被拒絕任務的run方法,除非執行緒池已經shutdown,則直接拋棄任務。
②AbortPolicy
該策略下,直接丟棄任務,並拋出RejectedExecutionException例外。
③DiscardPolicy
該策略下,直接丟棄任務,什麼都不做。
④DiscardOldestPolicy
#該策略下,拋棄進入佇列最早的那個任務,然後試著把這次拒絕的任務放入佇列
以上是Java線程池參數的意思是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!