2012-05-16 14 views
16

¿Hay un equivalente de Linux epoll en Java?¿Hay equivalente epoll en Java?

epoll permite que un subproceso reaccione a una serie de eventos heterogéneos. Por ejemplo, puedo tener un hilo que reaccione a un evento de socket o a una entrada desde la consola. En C++ puedo implementar esto registrando stdio y el socket con epoll. Mi hilo se activará por un evento de cualquiera de estos.

¿Hay alguna instalación similar en Java? Miré el paquete nio, me permite registrar un número de sockets con un selector. Pero no parece estar lejos para registrar la consola/estándar io con un selector. ¿No estoy viendo algo? Hay otra manera de hacer esto?

Sobre el "por qué": quiero escribir un programa que se comunica a través de sockets, y quiero conducir este programa ingresando comandos desde la consola. Sé cómo se puede hacer esto separando la entrada de la consola y las comunicaciones en diferentes hilos, pero tengo curiosidad de saber si hay una manera de hacerlo en un solo hilo.

Gracias. df

+4

¿Se puede tomar un paso atrás y editar el post para explicar _por qué_ que quieres hacer esto? – Gray

+0

OK, actualicé la publicación. – dfreit

+0

Supongo que la 'entrada de la consola' estándar sería 'System.in' (aunque debe inyectar la referencia, no el código duro del uso). Sin embargo, no parece que genere eventos (es decir, no hay 'register()' o método similar), así que no creo que haya un comportamiento predeterminado como usted lo desea. Tendría que escribir (o encontrar) algo para proporcionar este comportamiento. –

Respuesta

4

Sí, el paquete nio permite el uso de Selector s que proporcionan la funcionalidad equivalente de poll()/select() y, de hecho una de las implementaciones utiliza epoll como backend (esto se selecciona a través de java.nio.channels.spi.SelectorProvider propiedad Java). Los selectores se usan generalmente con sockets de red, pero si observa las diferentes implementaciones Channel en los documentos, creo que es probable que también pueda usar este mecanismo con la entrada estándar (existen clases de ayuda que permiten moverse entre los antiguos Stream - API basadas y las API nio hasta cierto punto).

+2

No se puede. No puede registrar ningún canal con un 'Selector' que no sea' SelectableChannel', y los únicos 'SelectableChannels' son los canales de socket y los canales de canalización. – EJP

19

Mejoras en Java SE 6

java.nio

Una nueva aplicación java.nio.channels.SelectorProvider que se basa en el servicio de notificación de eventos epoll Linux está incluido. La instalación epoll está disponible en Linux 2.6 y kernels más nuevos. La nueva implementación SelectorProvider basada en epoll es más escalable que la implementación SelectorProvider tradicional basada en encuestas cuando hay miles de SelectableChannels registrados con un Selector. La nueva implementación de SelectorProvider se usará de manera predeterminada cuando se detecte el kernel 2.6. SelectorProvider basado en encuestas se utilizará cuando se detecte un núcleo pre-2.6.

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

+0

¿Es esto implementaciones Java que no sean Linux? Además, ¿puedes obtener un 'SelectorProvider' en la consola? – Gray