Я реализую неблокирующий HTTP-сервер на Java и решил использовать чистый Java NIO. Я объединяю селектор NIO с небольшим пулом потоков для выполнения операций, указанных селектором.
Покинув систему, выберите селектор по умолчанию (проверено в Linux 2.6 epoll и Mac OS Snow Leo KQueue) и используя Selector.select(TIMEOUT);
Я получаю пул потоков в состоянии монитора (ожидая получения монитора), в то время как основной поток (запускающий цикл событий селектора) остается всегда запущенным. В некоторых случаях состояние монитора (время ожидания получения монитора) занимает более 10 секунд.
Использование следующего подхода приводит к тому, что основной поток проводит большую часть своего времени в спящем режиме, меньше (почти ничего не контролирует состояние для потоков в пуле) и повышает пропускную способность (обрабатывается 1 тыс. запросов в секунду):
while (true) {
Thread.sleep(IOLoop.SELECT_TIMEOUT);
if (selector.selectNow() == 0)
continue;
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
//...
}
Кто-нибудь знает о последствиях/рисках этого решения или о том, как облегчить/устранить затраченное время на попытку получить монитор объекта с помощью метода выбора селектора с тайм-аутом?
Спасибо.