動態

詳情 返回 返回

ThreadPoolExecutor - 動態 詳情

基礎
線程池的7個參數,核心線程數,最大線程數,worker生存時間,時間單位,阻塞隊列,ThreadFactory,RejectExecutionHandler拒絕策略

阻塞隊列可以是ArrayBlockingQueue和LinkedBlockQueue,LinkedBlockQueue可以是無界隊列,如果是無界隊列,那麼非核心線程不會創建

自定ThreadFactory可以設置友好的線程名字,出現異常時候,可以根據線程的名字來排查

拒絕策略默認有四種,AbortPolicy拋異常,DiscardPolicy丟棄,DiscardOldPolicy丟棄最老的,CallerRunners主線程執行。這幾種拒絕策略都不是特別友好,一般會自定義拒絕策略,當拒絕的時候可以持久化或發送到消息隊列

線程池的執行過程,
1、小於核心線程數,創建核心Worker,調用runWorker執行任務,runWorker中死循環調用getTask從阻塞隊列中獲取任務。Worker內部持有一個Thread屬性,本身是一個Runnable
2、超過核心線程數,嘗試添加到阻塞隊列,此處如果隊列是無解的,那麼添加到阻塞隊列一定成功
3、如果添加阻塞隊列失敗,創建非核心Worker,調用runWorker執行任務
4、如果超過了最大worker數量,會執行策略。
5、當線程池中沒有任務的時候,就是getTask調用workQueue.poll(time)超時,如果worker數量大於核心線程數,那麼會回收該worker,如果允許回收核心的worker,那麼直接回收。在此處可以看出來,線程的生存時間超時是利用了阻塞隊列中的阻塞時間,如果超過了阻塞時間那麼就會回收
如果是Callable任務,那麼會封裝為FutureTask

執行過程

image.png

Add a new 評論

Some HTML is okay.