这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:
悟空聊架构
。本文已收录至 www.passjava.cn
线程池的生命周期
线程池生命周期包括:
- RUNNING:接收新的任务并处理队列中的任务
- SHUTDOWN:不接收新的任务,但是处理队列中的任务
- STOP:不接收新的任务,不处理队列中的任务,同时中断处理中的任务
- TIDYING:所有的任务处理完成,有效的线程数是0
- TERMINATED:terminated() 方法执行完毕。
生命周期状态和方法对应的关系:
线程池的拒绝策略
如果线程池中所有的线程都在忙碌,并且工作队列也满了(前提是工作队列是有界队列),那么此时提交任务,线程池就会拒绝接收。至于拒绝的策略,你可以通过 handler 这个参数来指定。
ThreadPoolExecutor 已经提供了以下 4 种策略。
- CallerRunsPolicy:提交任务的线程自己去执行该任务。
- AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。
- DiscardPolicy:直接丢弃任务,没有任何异常抛出。
- DiscardOldestPolicy:丢弃最老的任务,其实就是把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。
以上内置拒绝策略均实现了 RejectedExecutionHandler 接口,若以上策略仍无法满足实际需要,完全可以自己扩展 RejectedExecutionHandler 接口。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END