2009-02-26 17 views
56

Quali opzioni per async io (basato su socket) ci sono in java diverso da java.nio? Java.nio usa anche i thread nel backround (come penso che la libreria async-socket di .NET faccia, forse è stata cambiata) o è "vero" async io usando una chiamata select appropriata?IO asincrono in Java?

+6

Se lo streaming sottostante lo supporta,.NET utilizza porte di completamento IO e un thread ThreadPool per l'esecuzione di callback. –

+0

Jon, quando il flusso sottostante non lo supporta? –

+0

Qualche ragione specifica sul perché non usare java.nio? In realtà, sto cercando di implementare alcuni I/O asincroni nel mio progetto al lavoro e non ho mai usato nessuno dei due precedenti. Quindi voleva sapere. Grazie. – Bhushan

risposta

44

Il pacchetto NIO di Java (a partire da Java6) fornisce il supporto per I/O non bloccante solo tramite Selector s. Spero che Java7 venga distribuito con NIO.2, che include il supporto I/O asincrono. Oggi la soluzione migliore è utilizzare un framework. L'armistizio ha menzionato Mina. Ecco alcuni altri.

  1. Grizzly. Questo è il core I/O per il server Sun GlassFish. Grizzly offre una funzionalità per fare letture/scritture asincrone (tramite un modello di coda). Supporta TCP e UDP allo stesso modo. Ho usato Grizzly in un paio di progetti. Ci sono cose che mi piacciono e non mi piacciono del framework, ma per i dettagli questo è davvero un altro argomento. Dirò che è abbastanza facile mettere in moto qualcosa e Grizzly fa un sacco di cose pesanti per te.
  2. Netty. Questo progetto proviene da uno degli autori originali del progetto Mina. Non ho usato questo, quindi non so riguardo al suo supporto per l'I/O asincrono. Dovresti dare un'occhiata.

Ora, per quanto riguarda la domanda sui thread, i selettori NIO non utilizzano thread per I/O non bloccanti. In JDK6 usano select() in Windows e la funzione epoll sui nuovi kernel di Linux. Per l'I/O asincrono, i dettagli di threading dipendono dal framework.

+1

L'NIO di Java supporta anche il blocco dell'IO. ;) –

+1

Netty è asincrono e basato sugli eventi come MINA. Controlla le testimonianze e i rapporti sul rendimento scritti da utenti reali nella home page. :) – trustin

+0

Sembra che Java 7 abbia effettivamente rilasciato con I/O asincrono: http://openjdk.java.net/projects/nio/presentations/TS-5686.pdf –

12

java.nio è solo un pacchetto - una raccolta di classi "stupide" - di per sé non utilizza alcun utilizzo di thread. Se utilizzato correttamente, ad esempio nello Reactor design pattern, è possibile ottenere un I/O asincrono adeguato, completamente scalabile.

+0

La tua risposta mi sembra legittima, ma puoi spiegare di più? Un po 'più di spiegazioni per favore. –

6

Se si è interessati ad utilizzarlo per Network Stuff. Una scelta davvero buona è:

http://mina.apache.org/

Date un'occhiata lì il suo facile da usare e molto potente.

15

Un altro suggerimento in merito alle libs sarebbe Naga (http://naga.googlecode.com). È un po 'meno come un quadro e più come una biblioteca. Cerca di assomigliare più alle normali prese java, se questa è la tua tazza di tè. È minimalista rispetto a Grizzly, Mina e Netty.

+0

Naga sembra davvero un involucro molto carino attorno alle cose asincrone. –

+1

Se si desidera eseguire Socket I/O asincroni senza un framework che si intrometta, Naga è ciò che si desidera. – poindexter

+1

Il naga funziona bene con Dalvik/Android? –

2

Alla domanda originale, l'implementazione utilizza solo un thread per operazione I/O in un caso, AsynchronousFileChannel su sistemi Unix/Linux.

16

JAVA 7 è arrivato così la nuova risposta è NIO.2 con classe Future. Esempio:

Sul lato server:

final AsynchronousServerSocketChannel serverSocket= 
    AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection 
Future<AsynchronousSocketChannel> future= serverSocket.accept(); 
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled() 

//Do whatever you want .. 
InputStream stream = Channels.newInputStream(clientSocket) (...) 

Sul lato client:

AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open(); 
Future connected = localSocket.connect(ourServerSocketAddress); 
// later: if(future.isDone()) 
connected.get(); 

//Send something 
OutputStream os = Channels.newOutputStream(clientChannel); 
os.write (...) 

Aggiornamento: Se è possibile utilizzare il modello attore poi AKKA TCP IO sarebbe ancora meglio.

+3

Future non è vero asincrono. È basato su thread/semaforo: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html – Josmar

+9

Che cos'è "true async"? - Solo perché è implementato usando i thread non significa che non sia asincrono ... – DejanLekic