一、執行緒池的優點
1、執行緒池能夠復用已經創建了的執行緒來執行任務,從而降低了頻繁創建和銷毀執行緒所帶來的資源消耗;
2、任務創建完成時,不必等待執行緒的創建,能夠立即執行,提高了任務回應的速度,
二、創建執行緒池的七大核心引數
1、corePoorSize 核心執行緒數
執行緒池中長期存活的執行緒數量,一般情況下,當執行緒處于空閑狀態時也不會被銷毀,
2、maximumPoorSize 最大執行緒數
執行緒池中允許創建的最大執行緒數量,當執行緒池佇列滿后,能夠創建的最大執行緒數量(核心執行緒總數量 + 非核心執行緒總數量),
3、keepAliveTime 存活時間
非核心執行緒的最大空閑時間,當非核心執行緒處于空閑狀態的時長到達這個時間,就會被銷毀,
4、TimeUnit 時間單位
存活時間的時間單位,
5、workQueue 執行緒池作業佇列
存放作業任務的阻塞佇列,當有任務被提交時,若沒有執行緒能夠處理,該任務就會被放到隊尾,等待執行緒執行,
6、threadFactory 執行緒工廠
創建一個新的執行緒時,用到的執行緒工程,可以用來設定執行緒名等執行緒引數,
7、handler 拒絕策略
當執行緒池中的作業執行緒數量達到了最大執行緒數量,并且作業佇列也容量也滿了,此時有任務提交進來時,需要做的處理,
三、執行緒池的執行流程
如圖,執行緒池的執行策略可以分為三個步驟:
1、當任務提交時,若此時的作業執行緒數小于核心執行緒數,則會創建一個執行緒來執行任務;
2、當核心執行緒數已滿時,如果此時阻塞佇列沒有滿,則將任務放入到阻塞佇列中,等待執行緒執行;
3、若核心執行緒數和阻塞佇列都已滿時,會去判斷當前執行緒數是否達到最大執行緒數,沒有達到就會創建一個非核心執行緒來執行任務,達到就執行拒絕策略,
四、常用的四種作業佇列
1、ArrayBlockingQueue 基于陣列的有界阻塞佇列
當核心執行緒數已滿,會將新的任務放到佇列當中,并按照FIFO的順序等待執行緒調度,若佇列中的任務達到給定的數值,則會啟動新的執行緒去執行任務,若當前執行緒數量到達最大執行緒數量,則拒絕執行任務,
2、LinkedBlockingQuene 基于鏈表的無界阻塞佇列
也是按照FIFO的,容量為Integer型別的最大值,所以近似于無界,所以maxPoolSize此時就是無效的,因為佇列無界,能夠不斷添加任務,導致不會去創建非核心執行緒,執行緒數量最多等于核心執行緒數量,達不到最大執行緒數量,
3、SynchronousQuene 不快取任務的阻塞佇列
相當于沒有佇列,當當前執行緒數達到corePoolSize時,直接創建非核心執行緒執行任務,當當前執行緒數到達maxPoolSize后,則拒絕任務,
4、PriorityBlockingQueue 具有優先級的無界阻塞佇列
默認情況下,元素采用自然順序升序排列,也可以自定義類,然后實作compareTo()方法來指定元素排序規則,
五、常用的四種拒絕策略
1、AbortPolicy
中止策略,直接拋出 RejectedExecutionException 錯誤,執行緒池默認使用的策略,
撰寫一個簡單的執行deno:
public static void main(String[] args) { // 創建一個執行緒池 ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 3L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.AbortPolicy() ); for (int i = 0; i < 100; i++) { int finalI = i; poolExecutor.execute(() -> { try { Thread.sleep(1000); System.out.println("[" + Thread.currentThread().getName() + "]:" + finalI + "同學完成"); } catch (InterruptedException e) { e.printStackTrace(); } }); } poolExecutor.shutdown(); }
執行結果:達到最大執行緒數后,直接拋出錯誤
2、CallerRunsPolicy
呼叫者執行策略,將任務回傳給提交該任務的執行緒執行,
執行demo不變,將執行策略換為CallerRunsPolicy,運行結果:
可見,因為我們的main執行緒提交任務給執行緒池后,執行緒池佇列及執行緒數量都已滿,便將執行的任務回傳給main執行緒,由main執行緒執行,
3、DiscardPolicy
丟棄策略,將該任務丟棄,且不拋出例外,
執行demo不變,將執行策略換為DiscardPolicy,運行結果:
達到最大執行緒數后,不執行提交的任務,
4、DiscardOldestPolicy
丟棄最老的策略,丟棄佇列最前面的任務,
執行demo不變,將執行策略換為DiscardOldestPolicy,運行結果:
0~5號任務執行程序中,不斷有新的任務提交,最后執行到了第99號任務,因為前面的不斷被丟棄,99最后被放入佇列并被執行緒執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556516.html
標籤:其他
下一篇:返回列表