一、核心參數
1、corePoolSize
核心池的大小,即線程池維護線程的最少數量。當提交一個任務到線程池時,線程池會創建一個線程來執行任務,即使其他線程處於空閑狀態。如果池中的線程數達到corePoolSize後,新提交的任務將被放入隊列中等待。如果隊列已滿,且池中的線程數小於maximumPoolSize,則創建新的線程執行任務。如果池中的線程數達到maximumPoolSize,則根據設置的拒絕策略來處理任務。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
2、maximumPoolSize
線程池最大數量。當線程池中的線程數目達到這個數目時,新的任務會被放入隊列中等待。如果隊列滿了,調用者就必須自己處理這個任務。如果使用無界的任務隊列這個參數就沒有任何作用。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
3、keepAliveTime
線程池中工作線程空閑後,保持存活的時間。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
二、任務隊列參數
1、workQueue
任務隊列,用來存儲等待執行的任務。常用的有四種隊列:
// 線程池中任務隊列為SynchronousQueue ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); // 線程池中任務隊列為LinkedBlockingQueue ThreadPoolExecutor threadPoolExecutor2 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); // 線程池中任務隊列為ArrayBlockingQueue ThreadPoolExecutor threadPoolExecutor3 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100)); // 線程池中任務隊列為PriorityBlockingQueue ThreadPoolExecutor threadPoolExecutor4 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());
2、capacity
任務隊列的容量。如果任務數量達到這個值,新提交的任務將會被拒絕,並根據設置的拒絕策略來處理任務。
// 容量為100的有界隊列 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
三、超時策略參數
1、allowCoreThreadTimeOut
該屬性為true時,表示樣品允許為核心線程設置超時時間,即當線程數大於核心線程數時,核心線程也會參與超時檢查。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); threadPoolExecutor.allowCoreThreadTimeOut(true);
2、rejectedExecutionHandler
當線程池中的資源已經全部使用,添加新線程被拒絕時,會進行拒絕處理。常用的拒絕策略有四種:
// 拒絕策略為AbortPolicy ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.AbortPolicy()); // 拒絕策略為DiscardPolicy ThreadPoolExecutor threadPoolExecutor2 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardPolicy()); // 拒絕策略為DiscardOldestPolicy ThreadPoolExecutor threadPoolExecutor3 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy()); // 拒絕策略為CallerRunsPolicy ThreadPoolExecutor threadPoolExecutor4 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
四、線程池擴展參數
1、ThreadFactory
通過ThreadFactory方式自定義線程池中的線程對象,可以自定義線程的名字、是否為守護線程等。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() { private final AtomicInteger atomicInteger = new AtomicInteger(0); public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName("Thread-" + atomicInteger.getAndIncrement()); return thread; } });
2、beforeExecute和afterExecute
在每個任務之前和之後執行的操作。可以用來統計任務的執行時間等。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.AbortPolicy()); threadPoolExecutor.setThreadFactory(new ThreadFactory() { private final AtomicInteger atomicInteger = new AtomicInteger(0); public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName("Thread-" + atomicInteger.getAndIncrement()); return thread; } }); // 執行任務前處理 threadPoolExecutor.prestartAllCoreThreads(); threadPoolExecutor.execute(() -> { // 任務執行時間統計 long startTime = System.currentTimeMillis(); try { // 執行任務 } finally { // 任務執行時間統計 long endTime = System.currentTimeMillis(); log.info("任務執行時間: " + (endTime - startTime) + " ms"); } });
五、總結
本文主要對Java線程池中的主要參數進行了詳細的闡述,包括核心參數、任務隊列參數、超時策略參數以及線程池擴展參數。在使用線程池時,需要根據具體業務場景選擇合適的參數配置,避免線程池資源浪費或者任務無法及時執行的情況。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297800.html