JAVA线程池使用注意事项

线程池中重要的配置

  • 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

原文地址:https://www.cnblogs.com/kiko2014551511/p/11558091.html