2012-05-16 29 views
16

Czy istnieje odpowiednik epolu linuksowego w Javie?Czy w języku Java istnieje odpowiednik epollu?

Epoll pozwala wątkowi reagować na szereg heterogenicznych zdarzeń. Na przykład, mogę mieć wątek, który reaguje na zdarzenie socket lub dane wejściowe z konsoli. W C++ mogę to zaimplementować, rejestrując stdio i gniazdo za pomocą epola. Mój wątek zostanie wywołany przez zdarzenie z któregokolwiek z nich.

Czy jest podobny obiekt w Javie? Spojrzałem na pakiet nio, który pozwala mi zarejestrować kilka gniazd za pomocą selektora. Ale wydaje się, że nie ma tam miejsca, aby zarejestrować konsolę/standard io za pomocą selektora. Czy czegoś nie widzę? Czy jest inny sposób na zrobienie tego?

Na temat "dlaczego": Chcę napisać program, który komunikuje się za pośrednictwem gniazd, i chcę sterować tym programem, wprowadzając polecenia z konsoli. Wiem, jak można tego dokonać, oddzielając dane wejściowe konsoli i komunikaty od różnych wątków, ale jestem ciekawy, czy istnieje sposób, aby to zrobić w pojedynczym wątku.

Dzięki. df

+4

można zrobić krok do tyłu i edytować swój post wyjaśnić _why_ chcesz to zrobić? – Gray

+0

OK, zaktualizowałem post. – dfreit

+0

Domyślam się, że standardowe "wejście konsoli" prawdopodobnie będzie "System.in" (chociaż należy wstrzyknąć referencję, a nie używać twardego kodu). Jednak nie wygląda na to, że generuje zdarzenia (tj. - nie ma metody "register()" lub podobnej), więc domyślam się, że nie jest to zachowanie domyślne. Będziesz musiał napisać (lub znaleźć) coś, co zapewni takie zachowanie. –

Odpowiedz

4

Tak, pakiet nio umożliwia stosowanie Selector s zaopatrujących równowartość funkcjonalności poll()/select() i rzeczywiście jedna z implementacji wykorzystuje epoll jako backend (jest wybrany przez java.nio.channels.spi.SelectorProvider własności Java). Selektory są zwykle używane z gniazdami sieciowymi, ale jeśli przejrzysz różne implementacje Channel w dokumentach, myślę, że prawdopodobnie będziesz w stanie użyć tego mechanizmu również ze standardowym wejściem (istnieją klasy pomocnicze, które umożliwiają przenoszenie pomiędzy starym Stream - oparte interfejsy API i interfejsy API nio do pewnego stopnia).

+2

Nie możesz. Nie można zarejestrować żadnego kanału za pomocą 'Selectora', który nie jest 'SelectableChannel', a jedynymi' SelectableChannels' są kanały gniazd i kanały potoku. – EJP

19

Ulepszenia w Java SE 6

java.nio

Nowa realizacja java.nio.channels.SelectorProvider że opiera się na obiekcie powiadomień wydarzenie epoll Linux jest włączone. Funkcja epoli dostępna jest w jądrze Linux 2.6 i nowszym. Nowa implementacja SelectorProvider opartej na epollu jest bardziej skalowalna niż tradycyjna wersja SelectorProvider, gdy tysiące zarejestrowanych kanałów jest zarejestrowanych za pomocą Selektora. Nowa implementacja SelectorProvider będzie używana domyślnie po wykryciu jądra 2.6. SelectorProvider oparty na ankiecie będzie użyty po wykryciu jądra sprzed 2.6.

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

+0

Czy jest to przenośna implementacja Java w wersjach innych niż linux? Czy można uzyskać "SelectorProvider" na konsoli? – Gray

Powiązane problemy