java 线程池配置

简单记录下,配置线程池的时候,各个参数的具体作用

Java util并发包中的线程池配置

参数 描述
corePoolSize 核心线程数
maximumPoolSize 最大线程数,当核心线程数到达上限后,会在最大线程数范围内,创建新的线程来执行任务
keepAliveTime 空闲线程的存活时间
unit NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS
workQueue 阻塞队列,存放待执行的任务(spring的线程池会配置queueCapacity,供配置阻塞队列大小)
poolSize 线程池中正在运行状态的线程数量

简述

一个真正的线程池配置是需要经过线上吞吐量的测算得来的,corePoolSizemaximumPoolSize、以及queueCapacity之间不宜配置过大或过小。在线程初始化后,当新的任务提交执行,会生成一个核心线程来执行该任务,直至核心线程数量到达corePoolSize,此时再有任务进来时,会优先放入阻塞队列。当阻塞队列任务满之后(但poolSize小于maximumPoolSize),会创建新的线程来执行, 但新线程数量+核心线程数(corePoolSize )不能超过最大线程数(maximumPoolSize )。

线程池处理任务大致分为三种:

  1. poolSize < corePoolSize
    当线程池中正在运行的线程数量,小于核心线程数时,会优先选择创建新的线程来执行任务。

  2. poolSize == corePoolSize
    当任务数量逐渐增多,线程池中运行状态的线程达到了核心线程数,此时如果有新的任务进来,会优先放到阻塞队列中,就像是生产者、消费者模式一样,等已有的核心线程执行完当下的任务后,再从队列中捞一条任务出来执行。

  3. workQueue阻塞队列满了
    如果阻塞队列满了,这里需要分情况讨论一下:
    3.1 corePoolSize < maximumPoolSize
    如果阻塞队列满了,但是poolSize还小于最大线程数时,会创建新的线程(非核心线程,选择不同的机制可时非核心线程在keepAliveTime时间过后销毁)来执行阻塞队列中的任务。但总的线程数量不会超过maximumPoolSize。
    3.2 corePoolSize == maximumPoolSize
    如果阻塞队列满了,poolSize等于最大线程数时,此时如果有任务被提交执行,该任务会被线程池拒绝

你可能感兴趣的:(java 线程池配置)