java线程池创建的四种Java线程池使⽤的注意事项
项⽬中使⽤的线程池的地⽅很多,⼀直以来感觉对它的参数已经掌握的很好了,但是遇到⼏次问题之后才发现⽋缺的这么多
遇到的坑
任务提交后长时间没有执⾏
任务进⼊了队列,线程还在执⾏之前的任务。本质原因是对线程和队列的优先级认识不深刻,有⼀种错觉以为是所有线程都忙的时候才进⼊任务队列。实际上相反,是队列满的时候才会新建线程(线程数⼤于core size时)。
线程池中线程执⾏任务中⽆故消失(从⽇志可以看出,任务并未完成,也没有抛出异常)
⼀般情况下,代码中只会去捕捉RuntimeException,如果抛出Error则会导致线程退出,⽽异常信息⼜没有拿到。最佳的解决办法是给线程池设置UncaughtExceptionHandler
回顾线程池重要的配置
线程池参数
corePoolSize:核⼼线程数量
maximumPoolSize:最⼤线程数量
workQueue:等待队列
任务提交时,判断的顺序为 corePoolSize --> workQueue --> maximumPoolSize。
这个顺序⼀定不要弄错了
拒绝策略
RejectedExecutionHandler
AbortPolicy:直接抛出异常,这是默认策略
CallerRunsPolicy:⽤调⽤者所在的线程来执⾏任务
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执⾏当前任务
DiscardPolicy:直接丢弃任务
默认是抛出异常,除⾮想得特别清楚,不然轻易不要使⽤其他3种策略
内置的四种线程池

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。