面试官:你是如何评估一个线程池需要设置多少个线程?

2021-12-02 09:41:44 浏览数 (2)

Java并发编程是大厂第一轮面试中的高频面试题,而线程池又是其中的典型代表,本文将梳理关于线程池的工作机制,并提出灵魂之问:你对线程池的工作机制这么了解,那你在工作中是如何判断一个线程池需要创建多少个线程的呢?

1、线程池基本工作原理与面试指南

1.1 java线程池的核心属性

JAVA 线程池的核心属性如下:

  • int corePoolSize 核心线程数
  • int maximumPoolSize 线程池最大线程数
  • long keepAliveTime 线程保持活跃的时间
  • TimeUnit unit keepAliveTime 的时间单位
  • BlockingQueue< Runnable > workQueue 任务挤压队列
  • ThreadFactory threadFactory 线程创建工厂类
  • RejectedExecutionHandler handler 拒绝策略
1.2 向线程池提交任务时线程创建过程

那当用户向线程池提交一个任务的时候,线程池会如何创建线程呢?

  1. 首先线程池会判断当前已创建的线程是否小于 corePoolSize (核心线程数),如果小于,则无论已创建的线程是否空闲,都会选择创建一个新的线程来执行该任务,直到已创建的线程等于核心线程数。
  2. 当线程池中已创建的线程数等于核心核心线程数时,用户继续向线程池提交任务时,此时会先判断任务队列是否已满: 1)如果任务队列未满,则将任务放入队列中。 2)如果任务队列已满,则判断当前线程数量是否超过了最大线程数量,如果未超过,则创建一个新的线程来执行该任务,如果线程池已创建的线程数量等最大线程数,则执行拒绝策略。

量。

那我们怎么判断需要增加更多线程呢? 其实可以用jstack命令查看一下进程的线程栈,如果发现线程池中大部分线程都处于等待获取任务,则说明线程够用,如下图所示:

如果大部分线程都处于运行状态,可以继续适当调高线程数量。

0 人点赞