线程池的核心参数(Java线程池原理及核心参数)
图1 ThreadPoolExecutor类构造函数部分源码
一、由源码可以看出线程池有几个核心的参数概念:
1、核心线程数:corePoolSize【
首先看下SDK关于线程池ThreadPoolExecutor类的构造函数源码: 图1 ThreadPoolExecutor类构造函数部分源码 一、由源码可以看出线程池有几个核心的参数概念: 1、核心线程数:corePoolSize【allowCoreThreadTimeOut为false时,线程池中要一直保留的活跃线程数线程池linux,不受空闲时间限制】; 2、最大线程数:maximumPoolSize【线程池中允许的最大的活跃线程数,达到这个值后,不再创建新的线程】; 3、活跃时间:keepAliverTime【一个空闲线程的保活时间,超过这个时间线程就会被回收销毁】; 4、活跃时间单位:unit【保活时间单位】 5、工作队列:workQueue【用于存储未被线程调用的任务,进行排队等待线程池调用】 6、线程工厂:threadFactory【用于向线程池中创建新线程】 7、拒绝策略:handler【用于处理工作队列满了之后新来的任务】 二、线程池执行流程如下: 图2 线程池流程图 1、当我们提交任务给线程池,如果当前线程池的数量没有达到corePoolSize,线程池会创建新的线程来执行任务; 2、当线程数量达到corePoolSize的时候,后续任务将会进入工作队列进行排队执行,等待空闲线程来调用执行,队列未满之前,线程池中线程个数=核心线程数量; 3、当阻塞队列满了之后,那么将会继续创建( maximumPoolSize-corePoolSize)个数量的线程来执行任务,如果任务处理完毕, maximumPoolSize-corePoolSize额外创建的线程可等待keepAliveTime时间之后被自动回收销毁,即超过核心线程数的线程最多空闲keepAliveTime时间; 4、如果达到maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理。 三、线程池拒绝策略 JDK提供了4种拒绝策略: 图3 拒绝策略 1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略 2. CallerRunsPolicy:只用调用者所在的线程来处理任务 3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务 4. DiscardPolicy:直接丢弃任务,也不抛出异常 (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |