Tomcat 中 NIO 和 BIO 的根本区别是什么?

voi*_*ipp 5 tomcat nio

通过在 Tomcat 中设置 NIO 连接器,我们有 N 个池线程和 M 个工作线程。

通过设置 BIO 连接器,我们可以在线程池中拥有 N*M 个线程。那么两个连接器之间会有什么区别呢?

Mar*_*mas 9

在 BIO 中,每个新连接都会从连接器线程池中分配一个线程,并且该线程一直分配给该连接,直到连接关闭。这意味着线程在请求​​之间会长时间空闲(即在 HTTP 保持活动期间)。

在 NIO 中,每个新连接都会传递给 Poller。当要处理的连接上有数据时,会通知轮询线程。然后轮询器从连接器线程池中为该连接分配一个线程,并且该线程一直分配给该连接,直到所有数据都被读取/写入。然后将连接传递回轮询器,以便轮询器可以监视更多数据。

简而言之,这使 NIO 更具可扩展性。对于每个连接,BIO 需要线程池中的一个线程。NIO 可以维护比 BIO 多得多的连接,并且每个并发处理的请求只需要线程池中的一个线程。

  • 否。连接!= 请求。HTTP 连接在合理的百分比时间内处于空闲状态。使用 BIO,这些连接在空闲时消耗池中的一个线程。使用 NIO,空闲连接不会消耗池中的线程,从而允许 NIO 为具有相同线程数的更多并发连接提供服务。如果 Tomcat 接收的并发请求多于线程,则多余的请求会在线程可用时按到达顺序排队和处理。 (3认同)
  • 但是来自 NIO 连接器池的线程可能会耗尽(并且所有新连接都将被阻塞,等待可用线程),就像 BIO 的线程一样。不是一样的情况吗? (2认同)
  • 这是 BIO 在 Apache Tomcat 8.0.x 中被弃用并在 Apache Tomcat 8.5.x 中被删除的原因之一。 (2认同)