標籤:線程池
什麼是線程池:
線程池就是控制線程的一個池子。用來控制線程數量。
為什麼要使用線程池:
1.避免系統重複建立和銷毀線程影響啟動並執行時間(建立+銷毀>>執行時間時)
2.控制線程數量,線程過多會導致機器運行卡(大約一個線程佔用1M空間)
ThreadPoolExecutor構造方法
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
參數1:核心線程池大小(標準大小)
參數2:線程池最大大小
參數3:設定多長時間逾時回收線程
參數4:是一個枚舉,表示 keepAliveTime 的單位
參數5:存放任務的隊列
執行個體
public class ThreadPoolExecutorDemo {public static void main(String[] args) {//LinkedBlockingDeque線程隊列大小無限制,不會拋異常BlockingQueue<Runnable> queue = new LinkedBlockingDeque<Runnable>();//如果核心線程和最大線程相同,那麼該線程是固定大小線程池。ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.DAYS, queue);for(int i=0;i<20;i++){executor.execute(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());}});}System.out.println("-----------------------------------------------");for(int i=0;i<20;i++){executor.submit(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}});}executor.shutdown();}}
線程池在執行線程時會做出如下判斷:
1.如果線程數小於核心線程,那麼建立並執行這個縣城
2.如果線程數大於核心線程則放入隊列中
3.如果這時隊列滿了,並且小於最大線程數,那麼建立執行這個線程
4.如果隊列滿了,並且大於最大線程數,那麼拋異常。
當線程閑來無事時,超過了回收時間,並且線程池數量大於核心數量,那麼就回收,直到回到核心線程數量
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java 線程池ThreadPoolExecutor簡單應用