IO Assíncrono em Java?

Quais opções para o async io (baseado em soquete) estão lá em java e, em seguida, em java.nio? O java.nio também usa threads no backround (como eu acho que a biblioteca de sockets async do .NET faz, talvez tenha sido alterada) ou é o async io “true” usando uma chamada select adequada?

O pacote NIO do Java (a partir do Java6), fornece suporte apenas para E / S sem bloqueio , via Selector s. Espera-se que o Java7 seja lançado com o NIO.2, que inclui suporte de E / S asynchronous. Hoje, sua melhor aposta é fazer uso de um framework. ARMistice mencionou Mina. Aqui estão alguns outros.

  1. Grizzly Este é o núcleo de I / O do servidor GlassFish da Sun. O Grizzly fornece um recurso para fazer leituras / gravações assíncronas (por meio de um modelo de fila). Suporta tanto o TCP como o UDP. Eu usei o Grizzly em alguns projetos. Há coisas que eu gosto e desgosto no framework, mas para detalhar isso é realmente outro tópico. Eu vou dizer que é muito fácil conseguir alguma coisa funcionando e Grizzly faz um monte de trabalho pesado para você.
  2. Netty . Este projeto vem de um dos autores originais do projeto Mina. Eu não usei este, então não sei sobre seu suporte para E / S assíncronas. Você deveria dar uma olhada.

Agora, com relação à sua pergunta sobre encadeamentos, os Seletores NIO não usam encadeamentos para E / S sem bloqueio. No JDK6, eles usam select () no Windows e o recurso epoll nos novos kernels do Linux. Para E / S assíncrona, os detalhes de encadeamento dependem da estrutura.

JAVA 7 chegou tão nova resposta é NIO.2 com a class do Futuro. Exemplo:

No lado do servidor:

final AsynchronousServerSocketChannel serverSocket= AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection Future 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) (...) 

No lado do cliente:

 AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open(); Future connected = localSocket.connect(ourServerSocketAddress); // later: if(future.isDone()) connected.get(); //Send something OutputStream os = Channels.newOutputStream(clientChannel ); os.write (...) 

Atualização: Se você puder usar o modelo de ator, então o AKKA TCP IO seria ainda melhor.

Outra sugestão em relação a libs seria Naga ( http://naga.googlecode.com ). É um pouco menos como uma estrutura e mais como uma biblioteca. Ele tenta se parecer mais com os sockets comuns de Java, se essa for sua xícara de chá. É minimalista em comparação com Grizzly, Mina e Netty.

java.nio é apenas um pacote – uma coleção de classs “burras” – por si só, ele não emprega nenhum uso de threads. Quando usado corretamente, como no padrão de projeto do Reactor , você pode obter E / S assíncronas e totalmente escalonáveis.

Se você estiver interessado em usá-lo para Network Stuff. Uma boa escolha é:

http://mina.apache.org/

Dê uma olhada lá é fácil de usar e muito poderoso.

Para a pergunta original, a implementação consome apenas um thread por operação de E / S em um caso, AsynchronousFileChannel em sistemas Unix / Linux.