有人可以解释每个请求的线程数和每个连接的线程数吗? servlet工作的模型是什么?如何分配线程来处理HTTP请求?是线程/请求还是连接?
让我们说如果我想在我的Servlet
doGet()
方法中异步执行一个耗时的任务,我会使用Java执行程序启动一个新线程,以便在一个单独的线程中完成冗长的计算并立即发送回复。
现在确保我已经释放了处理我的HttpServletRequest
的线程,或者是否因为子线程仍在运行而仍在使用?
答案 0 :(得分:55)
每个请求意味着在发出HTTP请求时,会从池中创建或检索线程来为其提供服务。一个线程服务于整个请求。每个连接的线程都是相同的,除了线程用于整个连接,这可能是多个请求,并且在请求之间也可能有很多死时间。 Servlet容器是每个请求的线程。可能有一些实现为每个连接提供线程,但我不知道,而且看起来它会非常浪费。
在另一个线程中创建一个线程并没有建立任何特殊的关系,在大多数情况下这样做的全部意义是让一个线程做更多的工作或终止,而另一个线程继续工作。在您的方案中,使用不同的线程来执行请求所需的工作将如您所愿,允许立即发送响应。无论您的其他线程需要多长时间,用于提供该请求的线程也将立即可用于另一个请求。这几乎是 在每个请求的线程servlet容器中进行异步工作的方式。
警告:如果您在一个完整的Java EE容器中,可能会以某种方式管理线程,这样就不会产生自己的线程。在这种情况下,你最好向容器询问一个线程,但一般原则是相同的。