ThreadPoolExecutor
3 个最重要的参数:
corePoolSize
:核心线程数,线程数定义了最小可以同时运行的线程数量。maximumPoolSize
:线程池中允许存在的工作线程的最大数量workQueue
:当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,任务就会被存放在队列中。
ThreadPoolExecutor
其他常见参数:
keepAliveTime
:线程池中的线程数量大于corePoolSize
的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime
才会被回收销毁;unit
:keepAliveTime
参数的时间单位。threadFactory
:为线程池提供创建新线程的线程工厂handler
:线程池任务队列超过 maxinumPoolSize 之后的拒绝策略
hreadPoolExecutor饱和策略
ThreadPoolExecutor
饱和策略定义:
如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时,ThreadPoolTaskExecutor
定义一些策略:
AbortPolicy
:抛出RejectedExecutionException
来拒绝新任务的处理。CallerRunsPolicy
:调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。DiscardPolicy
:不处理新任务,直接丢弃掉。DiscardOldestPolicy
: 此策略将丢弃最早的未处理的任务请求。
ThreadPoolExecutor运行情况:
- 当在 execute(Runnable) 方法中提交新任务并且少于
corePoolSize
线程正在运行时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求 - 如果有多于
corePoolSize
但是小于
maximumPoolSize
当提交新的任务得时候,会将请求放进队列 - 如果队列满了则判断当前线程有没超过
maximumPoolSize
如果没有得话,则新建一个线程来执行,否则执行拒绝策略 - 当多余
corePoolSize
的线程在空闲
keepAliveTime
的时间过后被销毁