线程池

线程池

编码文章call10242025-05-16 14:38:364A+A-

线程池的参数

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
}
线程池包含着七个参数

corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:线程存活时间
unit:存活时间单位
workQueue:阻塞队列,用于存放任务
threadFactory:创建线程的工厂,一般我们会自定义工厂,用于设置线程的名称
handler:拒绝策略,线程池默认提供了四个拒绝策略
    AbortPolicy:直接抛出异常
    DiscardPolicy:直接丢弃当前任务
    DiscardOldestPolicy:丢弃最早的任务
    CallerRunsPolicy:使用任务线程执行当前的任务

那么这些参数在线程池中是如何工作的呢

首先,会判断线程池中的线程是否大于核心线程数corePoolSize,如果不大于,线程池则创建一个线程(使用定义的线程工厂[threadFactory]创建线程),执行当前的任务,如何大于,则判断线程池的阻塞队列(workQueue)是否已满,如果未满,则将任务添加到阻塞队列中,如果阻塞队列已满,则判断线程池的线程数是否大于最大线程数(maximumPoolSize),如果不大于,则创建一个线程执行当前的任务,如果线程池的线程数已达到最大线程数则执行拒绝策略(handler),当核心线程允许被回收或者线程池的线程数超过核心线程数时,线程会在等待了线程的空闲时间后,会被线程池回收。



线程池是否区分核心线程和非核心线程

在线程池中,实际是不区分核心和非线程线程的,这些线程在线程池中的地位是一样的,当线程池中的线程处于空闲状态并且线程处于可回收状态(1:线程池中的线程大于核心线程数,2:线程池可以回收核心线程),此时,线程从阻塞队列中读取任务会通过带超时时间的take方法获取任务,当take方法超时时,线程便会被回收。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4