线程池的核心参数包括以下七个:
-
corePoolSize: 这是线程池中的核心线程数,即池中会保留的最少线程数。当提交任务时,如果当前线程数小于核心线程数,线程池会创建新的线程来执行任务。如果当前线程数等于或大于核心线程数,则任务会被放入任务队列等待执行,除非队列已满。
-
maximumPoolSize: 表示线程池允许同时存在的最大线程数,包括核心线程和非核心线程(有时称为“救急”线程或“临时”线程)。当任务队列已满且仍有新任务提交时,线程池会尝试创建新的线程来执行任务,直到达到
maximumPoolSize
。此值必须大于等于corePoolSize
。 -
keepAliveTime: 定义了非核心线程在空闲状态下等待新任务的最长时间。当线程池中的线程数超过
corePoolSize
,且有线程空闲时间达到keepAliveTime
时,这些空闲线程会被终止,直到线程池大小回落到corePoolSize
。单位由unit
参数指定。 -
unit:
keepAliveTime
的时间单位,常见的如TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。 -
workQueue: 任务队列,用于存储待执行的任务。当核心线程都处于忙碌状态时,新提交的任务会被放入此队列中等待执行。通常使用阻塞队列(如
ArrayBlockingQueue
、LinkedBlockingQueue
、SynchronousQueue
等),以确保线程安全和任务调度的协调。 -
threadFactory: 线程工厂,用于创建新线程。通过自定义线程工厂,可以设置线程的优先级、命名规则、是否为守护线程等属性,以便更好地管理和识别线程池中的线程。
-
handler: 拒绝策略,当线程池和任务队列均无法接纳新任务时(即线程数已经达到
maximumPoolSize
,且任务队列已满),触发的拒绝策略。常见的拒绝策略有:AbortPolicy
(默认):抛出RejectedExecutionException
异常。CallerRunsPolicy
:调用方所在的线程自行执行被拒绝的任务。DiscardPolicy
:默默地丢弃被拒绝的任务。DiscardOldestPolicy
:移除任务队列中最旧的任务(最先入队的未开始执行的任务),然后尝试重新提交当前被拒绝的任务。
这些核心参数可以通过构造函数ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
来设置。正确配置这些参数对于优化线程池的性能、资源利用率以及系统整体响应能力至关重要。