2009-05-26 9 views

Respuesta

3

Mi entendimiento es que la aplicación Java se basa en la función de Unix select() c (me parece recordar que la aplicación de Windows era ligeramente diferente)

función del sistema operativo (y argumentos de JVM!) Diferentes funciones del sistema operativo nativo son llamado, pero lo que tienen en común es que es un código nativo; la funcionalidad básica no está implementada en Java.

Si desea crear una lib que acceda al select() (o similar) del sistema operativo subyacente (que de hecho se basa en manejadores de archivos), creo que se ve forzado a utilizar JNI. No creo que haya ninguna forma de evitarlo.

El Selector/SelectableChannel en Java es realmente un subconjunto anémico de lo que select() puede hacer.

+0

En otras palabras, ¿no hay forma de definir su propio SelectableChannel? – Gili

+1

A juzgar por el código fuente de Selector y SelectableChannel, no veo ninguna forma de evitar el hecho de que si desea definir su propio SelectableChannel, entonces lo que necesita hacer es escribir (y registrar) un nuevo SelectorProvider que proporcione su propio nuevo implementaciones nuevas de Selector y SelectableChannel (necesitan emparejarse) que admitan la funcionalidad extendida que desee (usando JNI o ​​algún otro método). – Nuoji

+0

¡El POE lo hizo bien! [POE :: Filter] (http://search.cpan.org/~rcaputo/POE/lib/POE/Filter.pm). – woky

2

Es probable que desee extender java.nio.channels.spi.AbstractSelectableChannel para crear la implementación que necesita. Si está pidiendo algo diferente, necesita hacer una pregunta más detallada. El código fuente de JDK se puede descargar bajo unas pocas licencias diferentes, dependiendo de la versión que esté descargando. Tiene la opción de ver las implementaciones de JDK (java.nio.channels.Channel, java.nio.channels.SocketChannel, etc.) para comprender completamente lo que necesita implementar. Sin embargo, si hace esto, tenga cuidado de no copiar el código de la fuente JDK a menos que pueda obedecer la licencia del código fuente que descargó.

El libro Java NIO puede ayudarlo.

+0

¿Cómo se puede implementar AbstractSelectableChannel cuando no tiene un SelectorProvider a mano? Se supone que SelectableChannel.provider() devolverá el proveedor que creó el canal, pero el proveedor predeterminado no puede haber creado su implementación. – Gili

+0

Supongo que mi punto es que en algún lugar debajo del capó, alguien debe estar invocando un bajo nivel select() contra los identificadores de archivo. No está claro cómo SelectableChannel proporciona Selector con la información necesaria para hacer su trabajo. ¿Cómo puede este último saber cuándo mi SelectableChannel está listo para leer, escribir, etc.? – Gili

Cuestiones relacionadas