【问题标题】:Is there epoll equivalent in Java?Java中是否有等效的epoll?
【发布时间】:2012-05-24 04:58:21
【问题描述】:

Java 中是否有类似 Linux epoll 的功能?

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

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

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

谢谢。 df

【问题讨论】:

  • 你能退后一步,编辑你的帖子来解释为什么你想这样做吗?
  • 我猜标准的“控制台输入”可能是System.in(尽管您应该注入引用,而不是硬编码使用)。但是,它看起来不像生成事件(即 - 没有 register() 或类似方法),所以我认为没有你想要的默认行为。你必须写(或找到)一些东西来提供这种行为。

标签: java multithreading epoll


【解决方案1】:

Java SE 6 中的增强功能

java.nio

包含基于 Linux epoll 事件通知工具的新 java.nio.channels.SelectorProvider 实现。 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

【讨论】:

  • 这是否可移植到非 Linux Java 实现?另外,你能在控制台上得到SelectorProvider吗?
【解决方案2】:

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

【讨论】:

  • 你不能。您不能使用不是SelectableChannelSelector 注册任何通道,并且唯一的SelectableChannels 是套接字通道和管道通道。
猜你喜欢
  • 2011-07-05
  • 2011-10-14
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2010-09-30
相关资源
最近更新 更多