apache Http11NioProtocol 是如何工作的?

use*_*807 5 nio tomcat7

我正在尝试使用 Tomcat 7 Http11NioProtocol 从 NIO 中获得好处。

我刚刚读了一些关于它的文章: Understanding the Tomcat NIO Connector

并浏览:tomcat docs

我仅使用 SimpleServlet 启动了简单服务器,它计算并发线程数,等待 10 秒并返回空结果:

public class SimpleServlet extends HttpServlet {

final static Logger logger = Logger.getLogger(SimpleServlet.class);
private static final AtomicInteger threadCntr = new AtomicInteger();

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
    logger.info("ProxyService doGet threads[" + threadCntr.incrementAndGet() + "]");
    try {
        Thread.sleep(10000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        logger.info("end processing");
        threadCntr.decrementAndGet();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

配置tomcat的server.xml以使用nio协议:

    <Connector port="8081" maxHttpHeaderSize="8192" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="200" minSpareThreads="5" maxSpareThreads="5"
           enableLookups="false" redirectPort="8443" acceptCount="1"
           connectionTimeout="20000" disableUploadTimeout="true" />
Run Code Online (Sandbox Code Playgroud)

我开始发送轻量级请求并使用 Java VisualVM 监视它:

    public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 1000; i++) {
        new Thread(() -> {
            executeHttp(URL, "test"); // impl hided
        }).start();
        Thread.sleep(10);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我看到只使用了 200 个线程(这没关系)但是客户端的请求每 10 秒处理次数不能超过 200 个在此输入图像描述

那么,BIO的区别在哪里呢?或者我错过了一些配置吗?Http11NioProtocol 的主要特点是什么?