Существует ли эквивалент epoll в Java?
Есть ли эквивалент Linux epoll в Java?
epoll позволяет потоку реагировать на ряд гетерогенных событий. Например, у меня может быть поток, который реагирует либо на событие сокета, либо на вход с консоли. В С++ я могу реализовать это, зарегистрировав stdio и сокет с epoll. Мой поток будет вызван событием из любого из них.
Есть ли аналогичное средство в Java? Я посмотрел на пакет nio, он позволяет мне регистрировать несколько сокетов с помощью селектора. Но, похоже, не было места для регистрации консоли/стандартного io с помощью селектора. Я что-то не вижу? Есть ли другой способ сделать это?
В "почему": я хочу написать программу, которая обменивается через сокеты, и я хочу управлять этой программой, введя команды с консоли. Я знаю, как это можно сделать, отделяя ввод консоли и сообщения от разных потоков, но мне интересно, есть ли способ сделать это в одном потоке.
Спасибо.
DF
Ответы
Ответ 1
Улучшения в Java SE 6
java.nio
java.nio.channels.SelectorProvider
новая реализация java.nio.channels.SelectorProvider
, основанная на средствах уведомления о событиях epoll в Linux. Средство epoll доступно в ядрах Linux 2.6 и новее. Новая реализация SelectorProvider, основанная на epoll, является более масштабируемой, чем традиционная реализация SelectorProvider, основанная на опросе, когда в Selector зарегистрированы тысячи SelectableChannel. Новая реализация SelectorProvider будет использоваться по умолчанию при обнаружении ядра 2.6. Основанный на опросе SelectorProvider будет использоваться при обнаружении ядра до 2.6.
https://docs.oracle.com/javase/8/docs/technotes/guides/io/enhancements.html
Ответ 2
Да, пакет nio
позволяет использовать Selector
, которые обеспечивают эквивалент функциональности poll()
/select()
, и на самом деле одна из реализаций использует epoll
в качестве бэкэнд (это выбирается через java.nio.channels.spi.SelectorProvider
Свойство Java). Селекторы обычно используются с сетевыми сокетами, но если вы просмотрите различные реализации Channel
в документах, я думаю, что, вероятно, вы также сможете использовать этот механизм со стандартным вводом (есть вспомогательные классы, которые позволяют перемещаться между старыми Stream
и API nio
до некоторой степени).