一、ThreadPoolExecutor的重要参数
1、corePoolSize:核心线程数
2、maxPoolSize:最大线程数
当核心线程与任务队列已满时线程池会创建新线程处理任务。当线程数达到maxPoolSize后会拒绝线程抛出异常。
3、keepAliveTime:线程空闲时间
当线程空闲时间达到keepalive后线程会推出,直到线程数等于核心线程数
4、allowCoreThreadTimeout:允许核心线程超时
设置为true的时候,当核心线程空闲时间达到keepAliveTime后,线程会退出。
5、queueCapacity:任务队列容量(阻塞队列)
当核心线程数达到最大时,新任务会放在队列中排队等待执行
6、rejectedExecutionHandler:任务拒绝处理器
(1)AbortPolicy 丢弃任务,抛运行时异常
(2)CallerRunsPolicy 执行任务
(3)DiscardPolicy 忽视,什么都不会发生
(4)DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务
如果不进行特殊设置,会采用AbortPolicy 丢弃任务,抛运行时异常。
二、线程池调优
利特尔法则(Little’s law):一个系统请求数等于请求的到达率与平均每个单独请求花费的时间之乘积。
依托利特尔法则通常根据3个要素来确定线程池参数设置;
(1)tasks :每秒的任务数,假设为500~1000
(2)taskcost:每个任务花费时间,假设为0.1s
(3)responsetime:系统允许容忍的最大响应时间,假设为1s
另外基于实践有以下几个配置公式:
1、corePoolSize = 每秒需要多少个线程处理=tasks/(1/taskcost) =tasks*taskcost
2、queueCapacity = (coreSizePool/taskcost)*responsetime
3、maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)
三、关于BlockingQueue的插入和提取