Существует ли эквивалент 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 до некоторой степени).