JavaNIO多路复用服务器:我应该使用工作线程来处理请求吗? 1 周,5 日 Questions & Answers 321 我应该在侦听器线程上接受连接和监视客户端,然后让工作人员处理对客户端的请求和应答,还是应该在一个线程上完成所有操作
# 1 楼答案 都不是 理想情况下,对于基于NIO的服务器,您可以使用Executors.newFixedThreadPool()之类的东西创建线程池,用于执行处理请求的所有处理 但是,不应该将请求分配给特定的线程,因为系统的其余部分也应该是异步的。这意味着,当请求处理程序需要执行一些冗长的I/O工作或类似的工作时,它不会阻塞线程并等待它完成,而是异步启动它,并通过向线程池提交新任务来安排处理在工作完成后继续。无法确定哪个线程将在该点接收工作,因此请求的处理可能最终会分散到多个线程 通常应该使用CompletableFuture协调异步处理,就像节点中使用Promise一样。看看我在这里的答案,它试图解释如何做到这一点:decoupled design for async http request
# 2 楼答案 如果您的请求处理是100%异步的,也就是说您在请求处理和期间从不等待任何东西,那么在同一个线程中执行所有操作可能会稍微好一点 如果您有一个多核系统,或者在请求处理期间等待I/O,那么您应该使用线程池
# 1 楼答案
都不是
理想情况下,对于基于NIO的服务器,您可以使用
Executors.newFixedThreadPool()
之类的东西创建线程池,用于执行处理请求的所有处理但是,不应该将请求分配给特定的线程,因为系统的其余部分也应该是异步的。这意味着,当请求处理程序需要执行一些冗长的I/O工作或类似的工作时,它不会阻塞线程并等待它完成,而是异步启动它,并通过向线程池提交新任务来安排处理在工作完成后继续。无法确定哪个线程将在该点接收工作,因此请求的处理可能最终会分散到多个线程
通常应该使用
CompletableFuture
协调异步处理,就像节点中使用Promise
一样。看看我在这里的答案,它试图解释如何做到这一点:decoupled design for async http request# 2 楼答案
如果您的请求处理是100%异步的,也就是说您在请求处理和期间从不等待任何东西,那么在同一个线程中执行所有操作可能会稍微好一点
如果您有一个多核系统,或者在请求处理期间等待I/O,那么您应该使用线程池