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

Java 一个线程可以同时处理多个请求吗?,java,multithreading,tomcat,Java,Multithreading,Tomcat,这个问题是针对Tomcat的,但是对于其他应用程序服务器/Servlet容器来说,普遍适用的答案也很有趣 根据我的理解,可以保证每个请求都由单个线程从请求处理线程池处理(让我们忽略应用程序请求处理代码异步执行某些工作的情况) 但我想知道的是,如果保证一个线程在同一时间只能服务于一个请求 换句话说,在线程T1上执行的请求R1的工作是否可能被抢占,然后线程T1被用于处理请求R2,之后R1的处理在T1上继续 或许,这个问题可以更概括为: 线程T1上可运行R1的执行是否可以“先发制人”,以利于在同一线程

这个问题是针对Tomcat的,但是对于其他应用程序服务器/Servlet容器来说,普遍适用的答案也很有趣

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

但我想知道的是,如果保证一个线程在同一时间只能服务于一个请求

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

或许,这个问题可以更概括为: 线程T1上可运行R1的执行是否可以“先发制人”,以利于在同一线程T1上执行另一个可运行R2


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

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

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


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

简而言之,答案是否定的

详细地说:当你说线程运行“runnable”时,我想你是指处理器(CPU)运行线程。java中的线程代表正在完成的工作,处理器是实际的执行者。多线程执行可能发生在单核CPU中,处理器在多个线程之间快速切换(每个线程都已定义了其工作)以产生同时执行的假象,但实际上一次只能执行一个线程


对于多核系统来说也是一样,如果要运行的线程数大于内核数,那么它们会再次在内核之间分割,每个内核逐个执行线程,停止并切换到另一个线程。

我同意;简而言之,答案是否定的

但当然:当谈到任何值得使用这个名称的“应用服务器”时,该服务器将使用一个线程池,其中包含所有“工作包”


因此,虽然T1上的R1不会被中断,但会运行到其完成;当然,之后T1将运行一些T2;等等

不,不能。一个线程将处理一个请求,直到完成为止。一个正在工作的线程永远不能暂停,然后再给另一个任务。谢谢你的回答。我最初的帖子/标题有两个问题,答案是/否相反(现在已修复)。我假设您在“线程T1上可运行R1的执行是否可以“先发制人”以支持在同一线程T1上执行另一个可运行R2”的问题上回答了“否”,对吗?@Ward这是正确的
Runnable
将保留其
线程
,如果这不是真的,它将导致许多奇怪的情况,例如
ThreadLocal
。好的,我看到Runnable将保留其线程。但我的问题略有不同:只要R1还没有完成,线程T1对其他可运行程序R2、R3不可用吗?换句话说,一个线程是否绑定到一个runnable,直到该runnable完成?不,你的问题没有什么不同。线程或可运行程序没有什么奇怪的地方。它们的执行与您期望的一样,除非您真的特意创建了一些
可运行的
切换
线程
(您毕竟可以创建子类
线程
)。谢谢您的回答。事实上,我确信T1稍后将被重新用于处理一些R2,R3。。。但我主要担心的是,T1是否可能在R1完成之前就已经被重新使用了。。。但事实并非如此,根据你的回答。。。