Java NIO多路复用服务器:我应该使用辅助线程来处理请求吗?

时间:2019-01-09 13:59:49

标签: java server nio nonblocking multiplexing

我应该在侦听器线程上接受连接并监视客户端,然后让工作人员处理请求并响应客户端,还是应该在一个线程上执行所有操作?

2 个答案:

答案 0 :(得分:2)

都不是。

理想情况下,对于基于NIO的服务器,您可以使用Executors.newFixedThreadPool()之类的东西来创建线程池,该线程池将用于执行所有处理请求的处理。

但是,不应将请求分配给特定线程,因为系统的其余部分也应该是异步的。这意味着,当请求处理程序需要执行一些冗长的I / O工作或类似的操作时,它不是异步地等待线程完成,而是阻塞线程并等待它完成,而是通过提交新的请求来安排处理工作在完成时继续任务到线程池。无法确定此时将由哪个线程接管工作,因此对请求的处理最终可能会分散到多个线程中。

通常应使用CompletableFuture来协调异步处理,就像在节点中使用Promise一样。在这里查看我的答案,它试图解释如何执行此操作:decoupled design for async http request

答案 1 :(得分:1)

如果您的请求处理是100%异步的,那就是说您永远不会在请求处理期间等待任何东西,并且您在单核系统上,那么在其中执行所有操作可能会更好一些相同的线程。

如果您具有多核系统,或者在请求处理期间等待I / O,则应改用线程池。