- 类图
线程池主要参数
corePoolSize
核心线程数,线程池中维持的最小线程数量。即使这些线程处于空闲状态,他们也不会被销毁。除非设置了allowCoreTheadTimeout
,任务添加时首先会检查当前工作线程数是否达到了corePoolSize
,如果没有达到则新建一个线程来处理。maximumPoolSize
最大线程数,当前线程数达到corePoolSize
时,如果继续有任务被提交,则添加到工作队列中,如果工作队列已满,则创建一个新的线程来处理刚提交的这个任务,但线程不能无限次创建maximumPoolSize
限制的就是这个数量。keepAliveTime
当线程已经处理完任务,而且线程数超过了corePoolSize
,则多余的线程在超过keepAliveTime
后就会被回收。unit
keepAliveTime
空闲线程存活时间单位。
我们以管理一个技术团队做举例:团队中有几个核心技术,是不能被辞掉的。称为corePoolSize,刚开始工作不多,他们每个人可以分到一个任务去做,后来随着任务超过了核心技术的数量,技术负责人说你这个需求得排队,于是新来的任务便被放到队列中。再后来,队列都放满了。技术负责人给hr说你得再找几个打下手的。但由于成本的考虑只能找maximumPoolSize-corePoolSize的数量的人,若果任务量大于workQueue.size() + maximumPoolSize,技术负责人说你这活我这么多人实在做不下去,所以会按照拒绝策略中设置的策略去拒绝或者重新执行任务。
任务拒绝策略
: 拒绝策略提供顶级接口RejectedExecutionHandler
,其中rejectedExecution
即定制具体的拒绝策略的执行逻辑callRunsPolicy
当触发拒绝策略且线程池没有关闭时,调用线程执行任务,一般用在并发比较小,不允许失败的场合,如果失败次数过多,失败提交比较频繁则会造成程序阻塞。abortPolicy
丢弃任务,并抛出RejectExecutionException
异常,线程池默认的策略,必须处理好抛出的异常,否则会打断当前的执行,影响后续任务的执行DiscardPolicy
直接丢弃,不抛异常DiscardOldestPolicy
如果线程池没有关闭,则丢弃线程池任务队列中最老的一个任务,并将新任务加入