Как мне определить свой собственный SelectableChannel? - PullRequest
6 голосов
/ 26 мая 2009

Как бы я определил новый тип java.nio.channels.SelectableChannel (скажем, для последовательных портов)?

Ответы [ 2 ]

3 голосов
/ 28 мая 2009

Насколько я понимаю, реализация Java основана на функции Unix select() c (кажется, я помню, что реализация Windows немного отличалась)

В зависимости от ОС (и аргументов JVM!) Вызываются разные встроенные функции ОС, но их объединяет то, что это собственный код - базовая функциональность не реализована в Java.

Если вы хотите создать библиотеку, которая обращается к select() (или подобному) базовой ОС (которая действительно зависит от файловых дескрипторов), я думаю, что вы в значительной степени вынуждены использовать JNI. Я не верю, что есть какие-то способы обойти это.

Selector / SelectableChannel в Java на самом деле является анемичным подмножеством того, что может select() делать.

2 голосов
/ 26 мая 2009

Возможно, вы захотите расширить java.nio.channels.spi.AbstractSelectableChannel, чтобы создать нужную реализацию. Если вы просите что-то другое, вам нужно дать более подробный вопрос. Исходный код JDK можно загрузить под несколькими разными лицензиями, в зависимости от того, какую версию вы загружаете. У вас есть возможность просмотреть реализации JDK (java.nio.channels.Channel, java.nio.channels.SocketChannel и т. Д.), Чтобы полностью понять, что вам нужно реализовать. Однако, если вы сделаете это, будьте осторожны, чтобы не копировать код из источника JDK, если вы не можете подчиняться лицензии загруженного исходного кода.

Книга Java NIO может вам помочь.

...