Java中是否有相当于Linux的epoll?
epoll允许线程对许多异类事件做出反应。例如,我可以有一个线程响应套接字事件或来自控制台的输入。在C ++中,我可以通过使用epoll注册stdio和套接字来实现这一点。我的线程将由来自其中任何一个的事件触发。
Java中是否有类似的设施?我看了一下nio包,它允许我用一个选择器注册一些套接字。但似乎没有用选择器注册控制台/标准io。我没有看到什么?还有另一种方法吗?
关于“为什么”:我想写一个通过套接字进行通信的程序,我想通过从控制台输入命令来驱动这个程序。我知道如何通过将控制台输入和通信分离到不同的线程来实现这一点,但我很好奇是否有办法在单个线程中执行此操作。
感谢。 DF
答案 0 :(得分:22)
Java SE 6中的增强功能
java.nio
包含基于Linux epoll事件通知工具的新java.nio.channels.SelectorProvider
实现。 epoll工具可以在Linux 2.6和更新的内核中使用。当使用Selector注册了数千个SelectableChannel时,新的基于epoll的SelectorProvider实现比传统的基于poll的SelectorProvider实现更具可伸缩性。检测到2.6内核时,默认情况下将使用新的SelectorProvider实现。当检测到2.6之前的内核时,将使用基于轮询的SelectorProvider。
https://docs.oracle.com/javase/8/docs/technotes/guides/io/enhancements.html
答案 1 :(得分:5)
是的,nio
包允许使用提供与Selector
/ poll()
等效的功能的select()
,实际上其中一个实现使用epoll
}作为后端(这是通过java.nio.channels.spi.SelectorProvider
Java属性选择的)。选择器通常与网络套接字一起使用,但是如果你查看文档中的不同Channel
实现,我认为你可能也可以将这种机制用于标准输入(有一些帮助类允许移动)在某种程度上,在基于Stream
的旧API和nio
API之间。)