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