一、ThreadPoolExecutor的定義和構造
ThreadPoolExecutor是線程池的一個實現類,它可以通過管理線程池中的線程來提高程序的性能和效率。下面介紹ThreadPoolExecutor的構造方法和參數:
public ThreadPoolExecutor(int corePoolSize, //線程池中核心線程數 int maximumPoolSize, //線程池最大線程數 long keepAliveTime, //超出核心線程數的空閑線程存活時間 TimeUnit unit, //存活時間的單位 BlockingQueue workQueue, //保存任務的阻塞隊列 ThreadFactory threadFactory, //線程工廠 RejectedExecutionHandler handler //拒絕策略 )
1、corePoolSize:線程池中維護的線程數量,即核心線程數,當線程池處於運行狀態時,即使線程處於空閑狀態也不會被回收;
2、maximumPoolSize:線程池中允許的最大線程數量;
3、keepAliveTime:當線程池中線程數量大於corePoolSize時,超出的空閑線程在被終止之前需要繼續維護的時間;
4、unit:keepAliveTime的時間單位;
5、workQueue:阻塞隊列,用於保存等待執行的任務;
6、threadFactory:線程工廠,用於創建新的線程;
7、handler:拒絕策略,用於處理當線程池已滿時如何拒絕新任務的策略。
二、線程池中的線程池狀態
線程池狀態主要包括RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED。下面介紹這些狀態的含義:
1、RUNNING:正在運行中,即線程池尚未關閉,並且其中的線程正在處理任務; 2、SHUTDOWN:線程池正在關閉中,不接受新的任務提交,但是隊列中的任務會繼續執行完; 3、STOP:線程池終止,不再接受新的任務,且正在處理的任務全部被中斷並移出工作隊列; 4、TIDYING:線程池處於SHUTDOWN狀態時,所有的任務都已經執行完畢,線程池正在進行關閉操作; 5、TERMINATED:線程池已經完全終止。
三、阻塞隊列的選擇
ThreadPoolExecutor使用阻塞隊列來保存等待執行的任務。下面介紹幾種常見的阻塞隊列:
1、ArrayBlockingQueue :一個基於數組結構的有界阻塞隊列,按照先進先出原則對元素進行排序;
2、LinkedBlockingQueue :一個基於鏈表結構的有界阻塞隊列,按照先進先出原則對元素進行排序,如果沒有指定容量,則為Integer.MAX_VALUE;
3、SynchronousQueue :一個不存儲元素的阻塞隊列,在這個隊列中每個插入操作必須等待另一個線程的移除操作,否則插入操作一直處於阻塞狀態;
4、PriorityBlockingQueue:帶有優先級的無界阻塞隊列,按照先進先出原則排序,同時可以按照指定的Comparator插入元素,優先級高的元素會被先移除;
5、DelayQueue:是一個帶有延時功能的無界阻塞隊列,元素必須先定義延時時間,只有延時時間到期後才能被取出,適用於定時任務。
四、線程池的拒絕策略
線程池中當任務數超過最大線程數且阻塞隊列已滿時,會觸發拒絕策略。下面介紹幾種常見的拒絕策略:
1、AbortPolicy:拋出RejectedExecutionException,即不作處理;
2、CallerRunsPolicy:由提交任務的線程執行該任務;
3、DiscardOldestPolicy:將等待時間最長的任務從隊列中刪除,然後執行新的任務;
4、DiscardPolicy:不處理,靜默丟棄。
五、ThreadPoolExecutor的使用示例
import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { //核心線程數為3,最大線程數為5,超過corePoolSize的線程數進入阻塞隊列,阻塞隊列大小為10,超過則使用拒絕策略。 ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i < 20; i++) { executor.execute(new Runnable() { @Override public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is running"); } }); } executor.shutdown(); } }
六、線程池的關閉
1、executor.shutdown():關閉線程池,會先停止接受新的任務,在等待所有任務執行完畢後關閉線程池;
2、executor.shutdownNow():立即關閉線程池,會嘗試停止所有正在執行的任務,並返回未執行的任務;
3、executor.awaitTermination(long timeout, TimeUnit unit):等待線程池終止的時間,或者等待超時時間的過程中被中斷。
七、總結
ThreadPoolExecutor事實上是Thread Pool模式的Java語言實現,它為並發編程提供了靈活而高效的線程池實現,適用於多種多樣的場景。在實際應用中,我們可以根據應用場景來選擇合適的的Thread Pool實例對象,以提高程序的性能和效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/312834.html