1.什么是线程池?
顾名思义,存放线程的池子,类比我们学过的数据库连接池
2.线程池的作用:
1)降低系统的资源的消耗
2)提高响应速度
3)提高线程的可管理性
2.线程池的七大参数:
1)int corePoolSize:核心线程数,
2)int maximumPoolSize:最大线程数
3)long keepAliveTime:空闲线程的存活时间
4)TimeUnit unit:空闲时间的存活时间的单位
5)BlockingQueue<Runnable> workQueue:任务缓存的阻塞队列(相当于候客厅)
6)ThreadFactory threadFactory:创建线程的线程工厂
7)RejectedExecutionHandler handler:任务拒绝策略
2.1)拒绝策略是干什么的?
当线程池中的线程数达到最大线程数,且阻塞队列已满,就会采用拒绝策略
4种拒绝策略:
1) AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略
2) CallerRunsPolicy:相对而言它就比较完善了,当有新任务提交后,如果线程池没被关 闭且没有能力执行,则把这个任务交于提交任务的线程执行,也就是谁提交任务,谁就 负责执行任务;
3) DiscardPolicy:丢弃任务,但是不抛出异常;
4)DiscardOldestPolicy:丢弃阻塞队列最老的任务,然后重新尝试执行任务(重复此过程)
3.线程池的原理:
当有请求任务提交过来,首先判断线程池中核心线程池是否都在执行任务,如果没有,则开一个新的线程来出来任务,如果核心线程池满了,则将提交过来的任务放到阻塞队列,阻塞队列已满就会开一些新的线程(非核心线程)来处理阻塞队列里面的任务,当阻塞队列满了,并且线程数已经达到了最大的线程数,这时候会采用拒绝策略,一段时间后,当线程空闲时,会根据keepAliveTime 来回收核心线程数 corePoolSize 之外的线程,同时若设置了 allowCoreThreadTimeOut 值为 true,也会对核心线程进行回收