线程池参数

1、corePoolSize: 核心线程数量,线程池中会存在这么多个线程,当线程数量(包含空闲线程)少于corePoolSize的时候,会优先创建新线程,可以设置allowCoreThreadTimeOut=true来让核心线程池中线程也移除
2、maximumPoolSize: 线程池的最大容量,线程池中的线程数量不得超过这么多个,除非阻塞队列设置为无界的
3、keepAliveTime: 空闲线程存活时间,线程空闲超过这个时间的时候就会销毁
4、unit: keepAliveTime的时间单位,分钟、秒等
5、workQueue: 线程工作队列,阻塞队列,线程池从这个队列中取线程,可以设置的队列类型(容量为:capacity):
ArrayBlockingQueue:有界阻塞队列,当线程数量n:corePoolSize <= n < maximumPoolSize 且 n >= capacity :创建新线程处理任务 当:n >= maximumPoolSize 且 n >= capacity 拒绝线程
LinkedBlockingQueue: 无界队列,maximumPoolSize不起作用,会一直创建线程 会造成OOM(outofmemory)
SynchronousQuene: 不缓存任务,直接调度执行,线程数超过 maximumPoolSize 则直接拒绝线程
PriorityBlockingQueue: 带优先级的线程队列
6、handler: 拒绝策略,线程数量达到maximumPoolSize时的策略,默认提供了4种:
AbortPolicy: 直接丢弃并抛出异常
CallerRunsPolicy: 线程池没有关闭则直接调用线程的run方法
DiscardPolicy: 直接丢弃任务
DiscardOldestPolicy: 丢弃最早的任务,并尝试把当前任务加入队列
7、threadFactory: 创建线程时使用的工厂,可以对线程进行统一设置,如是否守护线程、线程名等

银行类比线程池理解:

周末,银行七个窗口只来了两个值班的员工,那么这两个员工我们就叫做核心员工数
那天由于不知道什么原因,来银行办业务的人特别多,两个员工很快就忙不过来了,那么新来的人怎么办呢?只能排个号在休息区的椅子上坐着等,这一排椅子我们就叫做等待队列
很快,休息区也坐满了人,这个时候银行的处理业务的效率明显跟不上了,咋办呢?可以叫人会来加班(创建新的线程),由于银行只有7个窗口,所以最终只能有7个员工。最多七个柜台就叫做最大员工数
有了新的员工,人多了,处理业务的速度也上来了,会出现两种情况
虽然银行已经满负载了,但是人还是源源不断的来银行办业务,这个时候所有的工作人员都忙着,等待区也坐满了人,那么新的人怎么办呢?工作人员可以选择让新的员工明儿,或者一会儿再来,这个让新的人什么时候来的做法,就是一种拒绝策略的选择。
除了上面的情况还会有另一种情况,5个人来加班之后,效率提升,很快就把所有的业务做完了,然后银行就没有人办业务了,那么这多出来的五个人要一直在银行待着吗?肯定不是,他们会等一会儿然后回家,这个等一会儿我们可以叫做空闲等待时间