24

Java中是否有等效的Linux epoll?

epoll 允许线程对许多异构事件做出反应。例如,我可以有一个线程对套接字事件或来自控制台的输入做出反应。在 C++ 中,我可以通过使用 epoll 注册 stdio 和套接字来实现这一点。如果这些,我的线程将被任何一个事件触发。

Java中是否有类似的工具?我查看了 nio 包,它允许我使用选择器注册多个套接字。但是似乎没有办法用选择器注册控制台/标准 io。我没有看到什么吗?还有另一种方法可以做到这一点吗?

关于“为什么”:我想编写一个通过套接字进行通信的程序,并且我想通过从控制台输入命令来驱动这个程序。我知道如何通过分离控制台输入和与不同线程的通信来做到这一点,但我很好奇是否有办法在单个线程中做到这一点。

谢谢。df

4

2 回答 2

28

Java SE 6 中的增强功能

java.nio

java.nio.channels.SelectorProvider包括一个基于 Linux epoll 事件通知工具的新实现。epoll 工具在 Linux 2.6 和更新的内核中可用。当有数千个 SelectableChannel 注册到一个 Selector 时,新的基于 epoll 的 SelectorProvider 实现比传统的基于 poll 的 SelectorProvider 实现更具可扩展性。当检测到 2.6 内核时,将默认使用新的 SelectorProvider 实现。当检测到 2.6 之前的内核时,将使用基于轮询的 SelectorProvider。

https://docs.oracle.com/javase/8/docs/technotes/guides/io/enhancements.html

于 2012-11-08T07:42:13.663 回答
7

是的,该nio包允许使用Selectors ,它提供与poll()/等效的功能,select()并且实际上其中一个实现epoll用作后端(这是通过java.nio.channels.spi.SelectorProviderJava 属性选择的)。选择器通常与网络套接字一起使用,但如果您查看Channel文档中的不同实现,我认为您很可能也可以将这种机制与标准输入一起使用(有允许在旧Stream的基于 API 的 API之间移动的辅助类以及nio某种程度的 API)。

于 2012-05-16T16:56:58.593 回答