ThreadPoolExecutor
線程池的實現類是ThreadPoolExecutor類,完整的構造方法有7個參數,通過傳入不同的參數值可以實現不同功能的線程池。如單個線程的線程池,固定大小的線程池,可緩存無界的線程池,定時線程池等。參數如下:
1.corePoolSize 核心線程池大小,線程池執行任務時,優先會創建線程直到數量為這個值。
2.workQueue 阻塞隊列,核心線程池滿了后,將會創建線程放入阻塞隊列進行等待。對于無界的線程池此阻塞隊列是SynchronousQueue類型。
3.keepAliveTime 超時終止時間。超過核心線程池大小時,線程等待執行任務的時間,若超時則終止線程。使線程數量為corePoolSize。
4.unit keepAliveTime 的時間單位
5.maximumPoolSize 線程池最大數量。核心線程池和阻塞隊列都滿了后,會直接創建一個線程執行任務。如果此時線程總數超過了最大數量則調用handler。
6.threadFactory 創建線程的工廠,所有的任務都通過工廠來創建線程去執行。
7.handler 超出線程池最大數量后執行的處理程序,通常使用拒絕策略。
所有執行任務的線程都放在HashSet<Worker> workers中。還有一個原子類AtomicInteger ctl,ctl記錄了"線程池中的任務數量"和"線程池狀態"2個信息。ctl共包括32位。其中,高3位表示"線程池狀態",低29位表示"線程池中的任務數量"。
Worker
每一個worker包含了一個線程thread(由threadFactory創建,就是woker本身)和要執行的任務firstTask
線程池執行任務的入口是exectue()方法,通過ctl判斷當前線程池狀態后,來新增worker去執行任務還是添加到阻塞隊列。首先設置firstTask為要執行的任務Runnable,然后把當前worker創建為一個線程thread。啟動線程
從而執行worker中的run方法,從而執行runworker方法,最終會調用firstTask的run()。
Worker繼承了AQS,在執行任務時lock()加上獨占鎖保證線程安全。