有人可以解释一下什么是“每个请求一个线程”和“每个连接一个线程”吗?Servlets使用哪种模型?如何分配线程以处理HTTP请求?是线程/请求还是连接?
假设我想在我的Servlet
的doGet()
方法中异步执行耗时任务,我使用Java executors启动一个新线程,这样冗长的计算就在单独的线程中完成,立即发送响应。
现在,这是否确保我已经释放了正在处理我的HttpServletRequest
的线程,还是它仍然在使用,因为一个子线程仍在运行?
有人可以解释一下什么是“每个请求一个线程”和“每个连接一个线程”吗?Servlets使用哪种模型?如何分配线程以处理HTTP请求?是线程/请求还是连接?
假设我想在我的Servlet
的doGet()
方法中异步执行耗时任务,我使用Java executors启动一个新线程,这样冗长的计算就在单独的线程中完成,立即发送响应。
现在,这是否确保我已经释放了正在处理我的HttpServletRequest
的线程,还是它仍然在使用,因为一个子线程仍在运行?
每次请求意味着创建或从池中检索线程以服务于该请求。一个线程服务于整个请求,称为按请求分配线程。按连接分配线程则是同样的事情,只不过线程用于整个连接,可能包含多个请求,并且在请求之间也可能有很多空余时间。Servlet容器是按请求分配线程的。可能会有一些实现提供按连接分配线程,但我不知道,并且看起来这将非常浪费。
在另一个线程内创建线程并不建立任何特殊关系,在大多数情况下这样做的整个目的是让一个线程做更多的工作或终止,而另一个线程继续工作。在你的场景中,使用不同的线程来完成请求所需的工作将使响应能够立即发送,正如你所预期的那样。用于服务该请求的线程将立即可用于处理另一个请求,无论你的其他线程需要多长时间来完成。这几乎是在按请求分配线程的servlet容器中进行异步工作的方法。
注意:如果您在完整的Java EE容器中,线程可能会以使自己产生的方式来管理,这将导致产生自己的线程成为一个糟糕的想法。在这种情况下,最好向容器请求一个线程,但是一般原则仍然相同。