通過Executors類提供的方法
1、newCachedThreadPool:創建一個可緩存的線程池,若線程數超過處理所需,緩存一段時間后會回收,若線程數不夠,則新建線程
2、newFixedThreadPool:創建一個固定大小的線程池,可控制並發的線程數,超出的線程會在隊列中等待
3、newScheduledThreadPool:創建一個周期性的線程池,支持定時及周期性執行任務
4、newSingleThreadExecutor:創建一個單線程的線程池,可保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。
通過ThreadPoolExecutor類自定義
7個參數如下:
(1)corePoolSize:核心線程數,線程池中始終存活的線程數。
(2)maximumPoolSize: 最大線程數,線程池中允許的最大線程數。
(3)keepAliveTime: 存活時間,線程沒有任務執行時最多保持多久時間會終止。
(4)unit: 單位,參數keepAliveTime的時間單位,7種可選。
(5)workQueue: 一個阻塞隊列,用來存儲等待執行的任務,均為線程安全,7種可選。
(6)threadFactory: 線程工廠,主要用來創建線程,默及正常優先級、非守護線程。
(7)handler:拒絕策略,拒絕處理任務時的策略,4種可選,默認為AbortPolicy。
線程池的執行規則:
(1)當線程數小於核心線程數時,創建線程;
(2)當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。
(3)當線程數大於等於核心線程數,且任務隊列已滿:
- (3.1)若線程數小於最大線程數,創建線程;
- (3.2)若線程數等於最大線程數,拋出異常,拒絕任務;
線程池的優點
1、減少創建和銷毀線程的次數,每個工作線程都可以被重復利用,可以執行多個任務;
2、防止因為線程過多消從而耗過多的內存,導致死機;可以根據系統的承受能力,調整線程池中工作線程的數目,(每個線程需要約1MB的內存,線程開的越多,消耗的內存也就越大,最后死機)
線程復用,線程對象被反復使用
核心原理
線程池對Thread進行了封裝,並不是每次執行任務都會調用Thread.start()來創建新線程,而是讓每個線程去執行一個”循環任務“,在這個循環任務里,不停的檢查是否還有任務等待被執行,如果有則直接去執行這個任務,也就是調用任務的run()方法,把run()當作普通方法直接調用,而不是創建一個新線程來執行run()方法,所以線程數量並不增加
拒接策略
1、AbortPolicy:直接拋出異常,阻止線程正常運行
2、CallerRunsPolicy:如果被丟棄的線程任務未關閉,則執行該線程任務
3、DiscardOldestPolicy:移除任務隊列中最早的一個線程任務,並嘗試提交當前任務
4、DiscardPolicy:丟棄當前的線程任務而不做任何處理
5、自定義拒絕策略:可實現RejectedExecutionHandler接口老實現拒絕策略,並捕獲異常來實現自定義拒絕策略