newFixedThreadPool
是 Java 中 ExecutorService
接口的一个实现,它创建了一个固定大小的线程池。要配置 newFixedThreadPool
,你需要设置以下参数:
-
核心线程数(corePoolSize):这是线程池中始终保持活跃的线程数量。即使这些线程处于空闲状态,也不会被终止。如果任务数量超过了核心线程数,那么将会创建新的工作线程来处理任务。
-
最大线程数(maximumPoolSize):这是线程池中允许的最大线程数量。当任务数量超过了核心线程数,并且所有核心线程都在忙碌时,线程池会创建新的工作线程,直到达到最大线程数。
-
任务队列(workQueue):这是一个用于存储等待执行的任务的队列。当线程池中的线程完成任务后,新提交的任务会被添加到任务队列中。如果任务队列已满,且线程池中的线程都在忙碌,那么线程池会根据拒绝策略(RejectedExecutionHandler)处理无法执行的任务。
-
线程工厂(ThreadFactory):这是一个用于创建新线程的工厂。你可以使用自定义的线程工厂来设置线程的名称、优先级等属性。
-
拒绝策略(RejectedExecutionHandler):当任务队列已满,且线程池中的线程都在忙碌时,线程池会根据拒绝策略处理无法执行的任务。Java 提供了四种内置的拒绝策略:
- AbortPolicy(默认策略):直接抛出
RejectedExecutionException
异常。 - CallerRunsPolicy:在调用者线程中执行被拒绝的任务。
- DiscardPolicy:直接丢弃被拒绝的任务,不抛出异常。
- DiscardOldestPolicy:丢弃队列中最旧的任务,然后尝试重新提交被拒绝的任务。
- AbortPolicy(默认策略):直接抛出
下面是一个使用 newFixedThreadPool
的示例:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FixedThreadPoolExample { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueueworkQueue = new LinkedBlockingQueue<>(20); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); ExecutorService executorService = Executors.newFixedThreadPool(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, rejectedExecutionHandler); // 提交任务到线程池 for (int i = 0; i < 30; i++) { executorService.submit(() -> { System.out.println("Task executed by thread: " + Thread.currentThread().getName()); }); } // 关闭线程池 executorService.shutdown(); } }
在这个示例中,我们创建了一个固定大小为 5 的线程池,最大线程数为 10,空闲线程在 60 秒后会被终止。任务队列的容量为 20,使用默认的线程工厂和调用者运行策略作为拒绝策略。