线程池核心参数
corePoolSize: int 核心线程数
线程池初始化后,线程池中没有任何线程,线程池会等待任务再创建新线程去执行任务
线程池会在核心线程数的基础上,额外增加一些线程,额外增加的限度的上限叫maxPoolSize
1、如果线程数小于corePoolSize ,即使有其他线程处于空闲状态也会创建新线程来运行新任务
2、如果线程数等于或大于corePoolSize,但是小于maximumPoolSize,则将任务放入队列
3、如果队列已满,并且线程数小于maximumPoolSize,则创建新线程来运行任务
4、如果队列已满,并且线程数大于等于maxPoolSize,则执行拒绝策略拒绝任务
maximumPoolSize: int 最大线程数
keepAliveTime: long 保持存活时间
数量大于corePoolSize 部分线程在空闲情况下的存活时间
workQueue: BlockingQueue 任务存储队列
1、直接队列:SynchornousQueue 无缓存
2、无界队列 LinkedBlockingQueue
3、有界队列 ArrayBlockingQueue
threadFactory:
创建新线程时候的创建工程类
Handler: rejectExceptionHandler
AbortPolicy 抛出异常
DiscardPolicy 丢弃
DiscardOldestPolicy 丢弃队列中老任务
CallerRunsPolicy 让主线程提交者执行任务
fixedThreadPool corePoolSize = maximumPoolSize
使用的是无界队列,队列里的东西过多会导致oom
singleThreadExcutor 也是无界队列
cachedThreadPool corePoolSize = 0 maximumPoolSize = Integer.Max
可缓存线程池,无界线程池,直接交换队列
ScheduledThreadPool
勾子方法
线程池是如何复用线程的
通过拿到任务task,直接执行 task.run()
网友评论