MST
星途 面试题库

面试题:Java线程池中corePoolSize参数的作用及工作原理是什么

请详细阐述Java线程池中corePoolSize参数在整个线程池工作过程中的作用,当任务提交到线程池时,corePoolSize是如何影响线程池的行为的,比如任务数量小于corePoolSize时以及大于corePoolSize时线程池分别会有怎样的操作。
45.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

corePoolSize参数作用

corePoolSize 是Java线程池中核心线程的数量。核心线程是线程池中常驻的线程,即使它们处于空闲状态,也不会被销毁(除非设置了 allowCoreThreadTimeOut(true))。

任务数量小于corePoolSize时线程池的操作

当任务提交到线程池时,如果当前线程池中的线程数量小于 corePoolSize,线程池会创建新的线程来执行任务,而不会将任务放入阻塞队列。例如:

ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 3; i++) {
    executorService.submit(() -> {
        // 任务执行逻辑
        System.out.println(Thread.currentThread().getName() + " is running task.");
    });
}

在上述代码中,提交3个任务,由于任务数量小于 corePoolSize(假设 corePoolSize 为5),线程池会创建3个新线程分别执行这3个任务。

任务数量大于corePoolSize时线程池的操作

  1. 阻塞队列未满:当任务数量大于 corePoolSize 且阻塞队列未满时,线程池不会立即创建新线程,而是将任务放入阻塞队列。例如:
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(5);
ExecutorService executorService = new ThreadPoolExecutor(3, 5, 10L, TimeUnit.SECONDS, workQueue);
for (int i = 0; i < 6; i++) {
    executorService.submit(() -> {
        // 任务执行逻辑
        System.out.println(Thread.currentThread().getName() + " is running task.");
    });
}

这里 corePoolSize 为3,阻塞队列容量为5,提交6个任务时,3个任务由核心线程执行,另外3个任务放入阻塞队列等待执行。 2. 阻塞队列已满:当任务数量大于 corePoolSize 且阻塞队列已满时,如果当前线程池中的线程数量小于 maximumPoolSize,线程池会创建新的非核心线程来执行任务。例如:

BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(5);
ExecutorService executorService = new ThreadPoolExecutor(3, 5, 10L, TimeUnit.SECONDS, workQueue);
for (int i = 0; i < 9; i++) {
    executorService.submit(() -> {
        // 任务执行逻辑
        System.out.println(Thread.currentThread().getName() + " is running task.");
    });
}

corePoolSize 为3,阻塞队列容量为5,提交9个任务,3个任务由核心线程执行,5个任务放入阻塞队列,剩下1个任务会创建新的非核心线程(因为小于 maximumPoolSize 为5)来执行。如果任务数量继续增加超过 maximumPoolSize,则根据线程池的拒绝策略来处理新任务,如抛出异常、丢弃任务等。