Java中的asynchronousIO?

什么selectasync io(基于套接字)在那里Java和其他然后java.nio? 此外,java.nio在后台使用线程(因为我认为.NET的asynchronous套接字库,也许它已经改变),或者是真正的asynchronousio使用适当的select呼叫?

Java的NIO包(从Java6开始)通过Selector仅支持非阻塞I / O。 Java7有望与NIO.2一起出货,其中包括asynchronousI / O支持。 今天,你最好的select就是利用框架。 ARMistice提到Mina。 这里有一些其他的。

  1. 灰熊 。 这是Sun的GlassFish服务器的I / O核心。 Grizzly为进行asynchronous读/写(通过队列模型)提供了一个工具。 它支持TCP和UDP。 我在一些项目中使用了Grizzly。 有一些我喜欢和不喜欢的框架,但详细这是另一个话题。 我会说,让事情变得很容易,灰熊为你做了很多事情。
  2. Netty 。 这个项目来自Mina项目的原作者之一。 我没有使用这个,所以我不知道它支持asynchronousI / O。 你应该看看。

现在,对于有关线程的问题,NIOselect器不使用线程来实现非阻塞I / O。 在JDK6中,他们使用Windows下的select()和更新的Linux内核上的epoll工具。 对于asynchronousI / O,线程细节取决于框架。

JAVA 7到了,所以新的答案是NIO.2和Future类。 例如:

在服务器端:

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) (...) 

在客户端:

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

更新:如果你可以使用actor模型,那么AKKA TCP IO会更好。

关于libs的另一个build议是Naga( http://naga.googlecode.com )。 它不像一个框架,更像一个图书馆。 它试图看起来更像普通的javasockets,如果那是你的一杯茶。 与灰熊,米娜和内蒂相比,它是极简的。

java.nio只是一个包 – “哑”类的集合 – 本身并没有使用任何线程。 正确使用时(例如在Reactordevise模式中) ,您可以实现正确的,完全可扩展的asynchronousI / O。

如果你有兴趣使用它的networking资料。 一个非常好的select是:

http://mina.apache.org/

看看它的易于使用和非常强大。

对于原来的问题,在Unix / Linux系统上,实现只在一种情况下每个I / O操作消耗一个线程,即AsynchronousFileChannel。