线程池中重要的配置
- corePoolSize : 核心线程数量
- workQueue : 等待队列
- maximumPoolSize : 最大线程数量
提交任务时,判断的顺序为 corePoolSize --> workQueue -->maximumPoolSize
当线程数小于核心线程数时,创建核心线程
当线程大于等于核心线程数,且任务队列未满时,将任务放入队列
当线程数大于核心线程数,且任务队列已满时,检查最大线程数是否已满,若未满,创建非核心线程,若满,根据拒绝策略抛出异常拒绝任务。
拒绝策略—RejectedExecutionHandler
- AbortPolicy : 直接抛出异常,这是默认策略
- CallerRunsPolicy : 用调用者所在线程来执行任务
- DiscardOldestPolicy : 丢弃阻塞队列中最靠前的任务,并执行当前任务
- DiscardPolicy : 直接丢弃任务
遇到的坑!!!
- 任务提交后长时间没有执行
1.任务进入了队列,线程还在执行之前的任务。提交的任务还在排队等待执行中
- 线程执行任务中无故消失
1. 线程拒绝策略配置为CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy时 ,线程池满了不会抛出异常。建议将拒绝策略配置为AbortPolicy
2. 一般情况下,代码只会去捕捉Exception,如果抛出Error(比如内存溢出)则会导致线程退出,而异常信息又没有拿到。最佳的解决办法是给线程池设置UncaughtExceptionHandler
参考地址
Java线程池使用的注意事项 https://www.jianshu.com/p/340f23001a65
欢迎关注微信公众号:shoshana