一个线程可以同时处理多个请求吗?

时间:2016-08-18 08:26:21

标签: java multithreading tomcat

此问题特定于Tomcat,但一般适用于其他Application Server / Servlet容器的答案也会很有趣。

根据我的理解,保证每个请求都由一个线程处理,来自请求处理线程池(让我们忽略应用程序请求处理代码异步执行某些工作的情况)。

但我想知道的是,如果可以保证单个线程只能同时为一个请求提供吗?

换句话说,是否可能抢占在线程T1上执行的请求R1的工作,然后使用线程T1处理请求R2,之后R1的处理继续在T1

可能这个问题可以更加概括为: 是否可以在线程T1上执行Runnable R1并预先排除'支持在同一个线程上执行另一个Runnable R2 T1?

我无法摆脱唠叨的感觉,我只是忽略了Java中多线程的某些基本原则,所以请启发我!

3 个答案:

答案 0 :(得分:4)

不,多线程背后的原理是处理器可以同时运行多个线程,在给定的时间量子之间切换它们。

但那是处理器。线程不再在工作单元之间切换,因为这是处理器的工作。

当然,对于异步servlet,这并不完全正确。这个想法是执行长等待操作的请求(对第三方服务器等的请求)可以在服务线程等待答案时释放服务线程,因此可以处理新的客户端请求。然而,这不是常规的"线程操作由应用程序服务器处理。

答案 1 :(得分:0)

简而言之,答案是否定的。

详细说明:当你说线程运行'runnable'时,我认为你的意思是处理器(CPU)运行一个线程。 java中的线程代表了正在完成的工作,处理器是实际的执行器。多线程执行可能发生在单核CPU中,其中处理器在多个线程之间切换(其中每个线程已经定义了它的工作)非常快速地给出了同时执行的错觉,但它实际上是一次一个。

同样的事情适用于多核系统,如果要运行的线程数超过核心数,那么它们又分配在核心之间,每个核心逐个执行线程,停止并切换到其他之一。

答案 2 :(得分:0)

我同意;简短的回答是没有。

但当然:在讨论任何值得该名称的“应用服务器”时,该服务器将使用所有“工作包”的线程池。

因此,虽然T1上的R1不会被中断,但会运行完成;肯定的是,之后T1会运行一些T2;等等。