2012-05-16 16 views
16

Gibt es in Java ein Äquivalent von Linux epoll?Gibt es in Java ein ePoll-Äquivalent?

Mit epoll kann ein Thread auf eine Reihe von heterogenen Ereignissen reagieren. Zum Beispiel kann ich einen Thread haben, der entweder auf ein Socket-Ereignis oder eine Eingabe von der Konsole reagiert. In C++ kann ich dies implementieren, indem ich stdio und den Socket mit epoll registriere. Mein Thread wird von einem Event ausgelöst, wenn dies der Fall ist.

Gibt es eine ähnliche Einrichtung in Java? Ich habe mir das nio-Paket angeschaut, es erlaubt mir eine Anzahl von Sockets mit einem Selektor zu registrieren. Aber es scheint nicht weg zu sein, die Konsole/Standard io mit einem Selektor zu registrieren. Sehe ich nicht etwas? Gibt es einen anderen Weg, dies zu tun?

Auf dem "warum": Ich möchte ein Programm schreiben, das über Sockets kommuniziert, und ich möchte dieses Programm durch Eingabe von Befehlen aus der Konsole fahren. Ich weiß, wie dies erreicht werden kann, indem man die Konsoleneingabe und die Kommunikation mit verschiedenen Threads trennt, aber ich bin neugierig, ob es einen Weg gibt, dies in einem einzigen Thread zu tun.

Danke. df

+4

Können Sie einen Schritt zurück und bearbeiten Sie Ihre Post erklären _why_ Sie dies tun wollen? – Gray

+0

OK, ich habe den Beitrag aktualisiert. – dfreit

+0

Ich vermute, Standard 'Konsole Eingabe' wäre wahrscheinlich 'System.in' (obwohl Sie die Referenz injizieren sollten, nicht hart-Code die Verwendung). Es sieht jedoch nicht so aus, als würde es Ereignisse erzeugen (zB - es gibt keine 'register()' oder ähnliche Methode), also glaube ich nicht, dass es ein Standardverhalten wie gewünscht gibt. Sie müssten etwas schreiben (oder finden), um dieses Verhalten zu ermöglichen. –

Antwort

4

Ja, das nio Paket ermöglicht die Verwendung von Selector s, die die Funktionalität äquivalent poll()/select() und tatsächlich eine der Implementierungen verwendet epoll als Backend (dies wird ausgewählt über java.nio.channels.spi.SelectorProvider Java-Eigenschaft) liefern. Selektoren werden normalerweise mit Netzwerk-Sockets verwendet, aber wenn Sie die verschiedenen Channel Implementierungen in den Dokumenten durchsehen, denke ich, dass Sie wahrscheinlich diesen Mechanismus auch mit Standard-Input verwenden können (es gibt Hilfsklassen, die es erlauben, zwischen alten Stream - basierte APIs und die APIs zu einem gewissen Grad).

+2

Sie können nicht. Sie können keinen Kanal mit einem 'Selector' registrieren, der kein' SelectableChannel' ist, und die einzigen 'SelectableChannels' sind die Socket-Kanäle und die Pipe-Kanäle. – EJP

19

Erweiterungen in Java SE 6

java.nio

Eine neue java.nio.channels.SelectorProvider Implementierung, die auf der Linux-epoll Ereignisbenachrichtigungsfunktion basiert sind im Preis inbegriffen. Die epoll-Funktion ist in Linux 2.6 und neueren Kernel verfügbar. Die neue SelectorProvider-Implementierung auf Epoll-Basis ist skalierbarer als die herkömmliche auf Abfragen basierende SelectorProvider-Implementierung, wenn Tausende von SelectableChannels bei einem Selector registriert sind. Die neue SelectorProvider-Implementierung wird standardmäßig verwendet, wenn der Kernel 2.6 erkannt wird. Der poll-basierte SelectorProvider wird verwendet, wenn ein Kernel vor 2.6 erkannt wird.

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

+0

Ist diese Portabilität auf Nicht-Linux-Java-Implementierungen übertragbar? Kann man auch einen 'SelectorProvider' auf der Konsole bekommen? – Gray