当前位置:  开发笔记 > 编程语言 > 正文

Java中的异步IO?

如何解决《Java中的异步IO?》经验,为你挑选了5个好方法。

除了java.nio之外,java中有哪些async io(基于套接字)的选项?java.nio也使用backround中的线程(因为我认为.NET的async-socket-library确实如此,可能它已经被更改了)或者使用正确的select调用它是"真正的"async io吗?



1> JLR..:

Java的NIO包(从Java6开始)仅通过Selector提供对非阻塞I/O的支持.希望Java7能够附带NIO.2,其中包括异步I/O支持.今天,你最好的办法就是利用一个框架.ARMistice提到了Mina.这是其他一些.

    灰熊.这是Sun GlassFish服务器的I/O核心.Grizzly提供了进行异步读/写(通过队列模型)的工具.它支持TCP和UDP.我在几个项目中使用了Grizzly.有些东西我喜欢和不喜欢这个框架,但要详细说明这是另一个话题.我会说很容易让事情发生并且Grizzly为你做了很多繁重的工作.

    Netty.该项目来自Mina项目的原作者之一.我没有使用过这个,所以我不知道它对异步I/O的支持.你应该看看.

现在,关于有关线程的问题,NIO选择器不会将线程用于非阻塞I/O. 在JDK6中,他们在Windows下使用select(),在新的Linux内核上使用epoll工具.对于异步I/O,线程细节取决于框架.


@ oconnor0 Async IO接受在用户空间和内核空间之间的数据转换期间删除额外的复制操作.这允许内核直接从用户空间访问数据.为此,应用程序准备内存并发布IO请求kernel.Control返回给应用程序(API非常类似于非阻塞).在未来的某个时间点内核可以在执行IO时访问用户空间内存.一旦完成内核就会触发回调等信号通过完成处理程序进入用户空间,以通知应用程序IO请求的结果.
非阻塞IO和异步IO之间有什么区别?
@ oconnor0内核调用的非阻塞IO在缓冲区满(写入时)和缓冲区空(读取时)下不会阻塞,这些状态会导致相应API的软错误返回.但是,非阻塞IO仍会复制用户空间和内核空间之间的数据导致不必要的额外数据复制,当涉及大量数据时,这会产生很大的开销.内核然后(可能)将数据再次复制到数据包大小的部分,并在其周围建立网络协议开销.一些网络堆栈/硬件驱动程序可能支持分散收集以优化内核阶段,但最坏的情况是3个副本.

2> Waldemar Wos..:

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 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会更好.


什么是"真正的异步"? - 仅仅因为它是使用线程实现的并不意味着它不是异步的......
未来不是真正的异步.它是基于线程/信号量的:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

3> Nuoji..:

关于libs的另一个建议是Naga(http://naga.googlecode.com).它有点像框架,更像是一个库.它试图看起来更像普通的Java套接字,如果这是你的一杯茶.与Grizzly,Mina和Netty相比,它很简约.



4> Yuval Adam..:

java.nio只是一个包 - 一个"哑"类的集合 - 它本身不使用任何线程.如果使用得当,例如在Reactor设计模式中,您可以实现适当的,完全可扩展的异步I/O.



5> 小智..:

如果您有兴趣将它用于网络资料.一个非常好的选择是:

http://mina.apache.org/

看看那里它易于使用,非常强大.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有