2009-05-26 6 views

risposta

3

mia comprensione è che l'implementazione Java si basa sulla funzione di UNIX select() c (mi sembra di ricordare che l'implementazione di Windows era leggermente diverso)

A seconda del sistema operativo (e args JVM!) Diverse funzioni native del sistema operativo sono chiamato, ma quello che hanno in comune è che è il codice nativo - la funzionalità di base non è implementata in Java.

Se si desidera creare una libreria che acceda allo select() (o simile) del sistema operativo sottostante (che effettivamente si basa su filehandle), penso che si sia praticamente obbligati a utilizzare JNI. Non credo che ci siano dei modi per aggirarlo.

Il selettore/SelectableChannel in Java è davvero un sottoinsieme anemico di cosa può fare select().

+0

In altre parole, non è possibile definire il proprio canale selezionabile? – Gili

+1

Giudicare dal codice sorgente a Selector e SelectableChannel Non riesco a vedere in alcun modo il fatto che se vuoi definire il tuo SelectableChannel, allora quello che devi fare è scrivere (e registrare) un nuovo SelectorProvider che fornisce il tuo nuovo nuove implementazioni di Selector e SelectableChannel (devono essere abbinate) che supportano la funzionalità estesa desiderata (utilizzando JNI o ​​qualche altro metodo). – Nuoji

+0

Il POE ha fatto bene! [POE :: Filtro] (http://search.cpan.org/~rcaputo/POE/lib/POE/Filter.pm). – woky

2

Probabilmente si desidera estendere java.nio.channels.spi.AbstractSelectableChannel per creare l'implementazione di cui si ha bisogno. Se stai chiedendo qualcosa di diverso, devi dare una domanda più dettagliata. Il codice sorgente JDK è scaricabile in alcune licenze diverse, a seconda della versione che stai scaricando. Hai la possibilità di visualizzare le implementazioni JDK (java.nio.channels.Channel, java.nio.channels.SocketChannel, ecc ...) per comprendere appieno ciò che devi implementare. Se si esegue questa operazione, tuttavia, fare attenzione a non copiare il codice dall'origine JDK a meno che non si possa rispettare la licenza del codice sorgente scaricato.

Il libro Java NIO potrebbe aiutarti.

+0

Come si può implementare AbstractSelectableChannel quando non si dispone di un SelectorProvider? SelectableChannel.provider() dovrebbe restituire il provider che ha creato il canale ma il provider predefinito non può aver creato la tua implementazione. – Gili

+0

Credo che il mio punto sia che da qualche parte sotto il cofano, qualcuno deve invocare un select di basso livello() contro gli handle di file. Non è chiaro come SelectableChannel fornisca al Selettore le informazioni necessarie per svolgere il proprio lavoro. Come può sapere quest'ultimo quando il mio SelectableChannel è pronto per leggere, scrivere, ecc.? – Gili