1. Spring MVC 的线程模型(TaskExecutor)
请说明 Spring MVC 的线程模型,尤其是基于 TaskExecutor 的线程池如何处理请求?
- 传统 Servlet 容器线程池模型(thread-per-request)
- TaskExecutor 在异步请求、异步任务中的作用
- 线程池配置与背压
传统 Spring MVC 基于 Servlet 容器(如 Tomcat)的线程池,采用 thread-per-request 模型:每个请求占用一个容器线程,从请求进入直到响应返回全程持有该线程。TaskExecutor 是 Spring 的线程池抽象,在 MVC 中用于异步请求处理(如 @Async、DeferredResult 的异步任务、异步监听器)和业务异步任务,其实现如 ThreadPoolTaskExecutor 封装了 JDK 线程池。通过配置核心线程数、最大线程数、队列容量与拒绝策略,可控制并发与资源占用。在异步请求场景,容器线程被释放回池,业务处理在 TaskExecutor 线程中完成。
线程模型决定了并发与资源使用方式。传统 MVC 的阻塞模型下线程数与并发强相关,配置不当会耗尽线程池;异步 + TaskExecutor 把"请求线程"与"业务线程"解耦,是提升吞吐的手段之一。