面试题答案
一键面试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时线程池的操作
- 阻塞队列未满:当任务数量大于
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
,则根据线程池的拒绝策略来处理新任务,如抛出异常、丢弃任务等。