2012-05-16 24 views
16

Esiste un equivalente di Linux epoll in Java?Esiste epoll equivalente in Java?

epoll consente a un thread di reagire a un numero di eventi eterogenei. Ad esempio, posso avere un thread che reagisce a un evento socket oa un input dalla console. In C++ posso implementarlo registrando stdio e il socket con epoll. Il mio thread verrà attivato da un evento da entrambi se questi.

C'è una struttura simile in Java? Ho guardato il pacchetto nio, mi permette di registrare un numero di socket con un selettore. Ma non sembra esserci via per registrare la console/standard io con un selettore. Non vedo qualcosa? c'è un altro modo per fare ciò?

Sul "perché": voglio scrivere un programma che comunica tramite socket, e voglio guidare questo programma inserendo i comandi dalla console. So come questo può essere fatto separando l'input della console e le comunicazioni a thread diversi, ma sono curioso di sapere se esiste un modo per farlo in un singolo thread.

Grazie. df

+4

Potete fare un passo indietro e modificare il tuo post per spiegare _perché_ si vuole fare questo? – Gray

+0

OK, ho aggiornato il post. – dfreit

+0

Immagino che lo standard 'input della console' sia probabilmente 'System.in' (anche se dovresti inserire il riferimento, non usare l'hard-code). Tuttavia, non sembra che generi eventi (es. Non c'è 'register()' o metodo simile), quindi non penso che ci sia un comportamento predefinito come tu vuoi. Dovresti scrivere (o trovare) qualcosa per fornire questo comportamento. –

risposta

4

Sì, il pacchetto nio consente l'utilizzo di Selector s che forniscono la funzionalità equivalente di poll()/select() ed effettivamente una delle implementazioni utilizza epoll come terminale (questo è selezionato tramite java.nio.channels.spi.SelectorProvider proprietà Java). I selettori vengono solitamente utilizzati con socket di rete, ma se si esaminano le diverse implementazioni Channel nei documenti, penso che sia possibile utilizzare questo meccanismo anche con l'input standard (esistono classi di supporto che consentono lo spostamento tra il vecchio Stream - API basate e API nio in una certa misura).

+2

Non è possibile. Non è possibile registrare alcun canale con un 'Selettore' che non sia un' Canale selezionabile', e l'unico 'Canali selezionabili' sono i canali socket e i canali pipe. – EJP

19

Miglioramenti a Java SE 6

java.nio

una nuova implementazione java.nio.channels.SelectorProvider che si basa sulla struttura di notifica degli eventi epoll Linux è incluso. La struttura di epoll è disponibile in Linux 2.6 e kernel più recenti. La nuova implementazione SelectorProvider basata su epoll è più scalabile rispetto alla tradizionale implementazione SelectorProvider basata su poll quando ci sono migliaia di Canali selezionabili registrati con un Selettore. La nuova implementazione SelectorProvider verrà utilizzata per impostazione predefinita quando viene rilevato il kernel 2.6. Il SelectorProvider basato su sondaggi verrà utilizzato quando viene rilevato un kernel precedente alla 2.6.

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

+0

È questo portatile per implementazioni Java non-linux? Inoltre, puoi avere un 'SelectorProvider' sulla console? – Gray