JDK和TOMACAT的线程池在核心线程数达到上限后处理方式的区别

401 阅读1分钟
  • JDK 的线程池(ThreadPoolExecutor)的行为是这样的:当任务被提交给线程池时,它会首先尝试将任务分配给核心线程来处理。如果核心线程数已满,则任务会被添加到线程池的工作队列中等待执行。如果工作队列也已满,JDK 的线程池会根据最大线程数来判断后续处理方式。如果最大线程数大于当前核心线程数且小于等于最大限制线程数(包括核心线程数),则会创建额外的线程来处理任务。如果最大线程数已满,则根据所设置的拒绝策略来处理该任务。

  • Tomcat 的线程池(Executor)的行为与 JDK 的线程池有所不同。在 Tomcat 中,当请求到达时,线程池首先尝试分配给核心线程来处理。如果核心线程数已满,则任务会直接分配给非核心线程来处理,而无需等待。如果所有线程(包括核心和非核心)均已满,则任务会被添加到线程池的任务队列中等待执行。只有当任务队列也已满时,Tomcat 的线程池才会创建新的线程来处理任务,直到线程数达到最大线程数限制。

PS: 这些行为是默认情况下的处理方式,可以通过相应的配置参数进行调整和自定义。具体实际应用中使用的线程池实现以及其配置方式可能会略有不同,建议查阅相关文档或具体的实现代码以获取更准确的信息。