線程池的初次接觸

這篇關於線程池的文章寫的不完整,點擊下方鏈接查看我的另一篇線程池文章,幫你拿下線程池!

https://blog.csdn.net/hgelin/article/details/100034454

2.線程池(juc包下)-面試重點

1)使用線程池的優點如下:

(1)降低資源的消耗:通過重複利用已創建的線程降低線程創建與銷燬帶來的消耗。                                                   (2)提高響應的速度:當新任務到達時,任務不需要等待線程創建就可以立即執行。                                                   (3)提高線程的可管理性:使用線程池可以統一執行線程的分配、調度與監控。


圖:
  corePoolSize->BlockingQueue->maxiumSize->RejectedExecutionHandler  

 2)線程池執行任務的流程:當一個Runnable/Callable對象到達線程池時,執行策略如下:

 第一步:首先判斷核心線程池中的線程是否都在執行任務,如果是,再次查看核心線程池是否已滿,如果未滿創建新的線 程執行任務
如果核心線程池有空閒線程,則任務直接分配給空閒線程執行,否則執行第二步。
第二步:判斷工作隊列(BlockQueue)是否已滿,如果工作隊列沒有滿,將提交任務存儲到工作隊列中等待覈心池調 度,否則,若工作隊列已滿,進入步驟3 第三步:判斷當前線程池中的線程數是否已達到最大值maxumSize,若已達到最大值,將任務交給飽和策略處理,否 則,繼續創建新線程執行此任務。

3)線程池的使用 通過創建ThreadPoolExecutor來創建線程池  

public ThreadPoolExecutor(int corePoolSize,                            
                          int maximumPoolSize,                            
                          long keepAliveTime,                                    
                          TimeUnit unit,                                            
                          BlockingQueue workQueue,                               
                          RejectedExecutionHandler handler)


(1)corePoolSize(核心池大小):當提交任務到線程池時,線程池會創建一個新的線程來執行任務,即使核心池中有 其他空閒線程也會創建新線程,一直到線程數達到核心池的大小爲止。
調用prestartAllCoreThread()線程池會提前創建並啓動所有核心線程。

(2)workQueue(工作隊列):用於保存等待執行任務的阻塞隊列。可以選擇以下幾個直阻塞隊列:                                               a. ArrayBlockingQueue:基於數組結構的有界阻塞隊列,此隊列按照FIFO原則對元素進行排序。
   b. LinkedBlockingQueue:基於鏈表結構的阻塞隊列,按照FIFO對元素進行排序,吞吐量高於 ArrayBlockingQueue,Executors.newFixedThreadPool()採用此隊列
  c. SynchronousQueue:一個不存儲元素的阻塞隊列,無界隊列。每個插入操作必須等到另一個線程調用移除操 作,否則插入操作一直處於阻塞狀態,通常吞吐量比LinkedBlockingQueue還要高。 Executors.newCachedThreadPool()採用此隊列
  d. PriorityBlockingQueue:具有優先級的無界阻塞隊列。 (3)maximumPoolSize(線程池最大數量):線程池允許創建的最大線程數。如果隊列已滿並且已創建的線程數小於 此參數,則線程池會再創建新的線程執行任務。否則,調用飽和策略處理。如果採用無界隊列,次參數無意義。
(4)keepAliveTime(線程活動保持時間):線程池的工作線程空間後,保持存活的時間。若任務很多,並且每個任務 執行的時間很短,可以調大此參數來提高線程利用率。
(5)TimeUnit(第四個參數的時間單位)                                                                                                                                (6)RejectedExecutionHandler(飽和策略):當隊列和線程池都滿了的情況,說明線程池處於飽和狀態,此時使用 飽和策略來處理任務 。 默認採用AbortPolicy.JDK一共內置四種飽和策略 a. AbortPolicy,表示無法處理新任務拋出異常,JDK默認採用此策略 b. CallerRunsPolicy,等待調用者線程空閒後運行任務。 c. DiscardOldestPolicy,丟棄阻塞隊列中最近的一個任務並執行當前任務。 d.DiscardPolicy,不處理,直接將新任務丟棄,也不報錯   FutureTask類執行任務只執行一次,並且會阻塞其他線程 Future.get()方法會阻塞其他線程,一直等到當前Callable線程執行完畢拿到返回值爲止。   JDK7新增Fork-join()框架,將大任務拆分成多個子任務進行,最終將結果由各個子任務彙總得來。  

 4)JDK內置的四大線程池
普通調度池:
(1)創建無大小限制的線程池:Exectors.newCachedThreadPool()
適用於很多短期任務的小程序,負載較輕的服務器。
(2)固定大小線程池:Exectors.newFixedThreadPool(int nThreads)
適用於爲了滿足資源管理的需求而需要限制當前線程數量的應用場合,適用於負載比較重的服務器
(3)單線程池:Exectors.newSingleThreadPool()
適用於需要保證順序的執行各個任務,並且在任意時間點不會有多個線程活動的場景。
定時調度池:
 

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