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。 这里有一些其他的。
- 灰熊 。 这是Sun的GlassFish服务器的I / O核心。 Grizzly为进行asynchronous读/写(通过队列模型)提供了一个工具。 它支持TCP和UDP。 我在一些项目中使用了Grizzly。 有一些我喜欢和不喜欢的框架,但详细这是另一个话题。 我会说,让事情变得很容易,灰熊为你做了很多事情。
- 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。
对于原来的问题,在Unix / Linux系统上,实现只在一种情况下每个I / O操作消耗一个线程,即AsynchronousFileChannel。