Ответ 1
NIO и Comet полностью не связаны: вы можете смешивать и сопоставлять их.
Использование разъема NIO (или APR в этом случае) позволяет обрабатывать больше запросов с меньшим количеством потоков из-за модели потоковой передачи. См. http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Connector_Comparison для сравнения между соединителями.
Comet (и Websocket) имеют совершенно другую модель диспетчеризации, которая требует другой архитектуры приложения и обеспечивает более высокую пропускную способность по-другому.
Сценарий, который вы задаете в своем вопросе, является типичной блокировкой модели с одним потоком за запрос. На шаге 4 соединитель Java BIO (который по умолчанию работает через Tomcat 7) будет продолжать ждать дополнительных запросов на существующий соединитель - для HTTP-запросов keepalive. Если клиент не устанавливает Connection:close
в предыдущем запросе и не закрывает соединение, поток будет зависать до тех пор, пока не будет достигнут тайм-аут keepalive. Если вы используете разъем NIO, поток будет возвращаться в пул потоков сразу после отправки ответа, и вы не будете "тратить" поток на запросы keepalive, которые никогда не придут.
Comet/Websocket работает совершенно по-другому, передавая сообщение специально написанному сервлету (и необязательным фильтрам), и потоки используются только тогда, когда есть сообщения для отправки или данные, которые нужно записать.
ОБНОВЛЕНИЕ 2016-08-19
Tomcat 8.5 и 9.0 полностью сбросили разъем BIO. Это связано с тем, что многие из новых API и технологий (например, Websocket) требуют неблокирующей семантики, а создание неблокирующего сервиса поверх API блокировки очень сложно. Код, необходимый для выполнения этой работы, делал остальную часть кода Tomcat очень уродливым и т.д., И поэтому было принято решение полностью отказаться от BIO-коннектора. Таким образом, для Tomcat 8.5 и далее доступны только NIO, NIO2 и разъемы на основе APR.
Обратите внимание, что с Tomcat 8.5 и 9.0 поддержка Comet была отключена. Использование кометы должно быть заменено на Websocket, который является более стандартным протоколом.