试图为自己总结这两个概念之间的区别(因为当我看到人们在一个句子中同时使用这两个概念时,我真的很困惑,比如“非阻塞异步IO”,我试图弄清楚它是什么意思)。
因此,在我的理解中,非阻塞IO是主要的OS机制,如果有任何数据准备就绪,它将处理IO,否则只返回错误/不做任何事情。
那么实际上什么是“非阻塞异步IO”呢?以及如何在Java(标准JDK,没有外部库,我知道有Java.nio.Channels.{Channels,Selector,SelectorKey}
和Java.nio.Channels.{AsynchronousSocketChannel}
)中实现所有的IO:非阻塞IO、异步IO和非阻塞异步IO(如果有的话)?
那么实际上什么是“非阻塞异步IO”呢?
要回答这个问题,您必须首先理解阻止异步I/O这件事是不存在的。异步的概念决定了没有等待、没有阻塞、没有延迟。当您看到非阻塞异步I/O时,非阻塞位仅用于进一步限定该术语中的异步形容词。因此,有效地说,非阻塞异步I/O可能有点冗余。
主要有两种I/O。同步和异步。同步阻塞当前执行的线程,直到处理完成,而异步不阻塞当前执行的线程,而是将控制权传递给OS内核,以便进一步处理。然后,当提交的任务完成时,内核通知异步线程
异步通道组
java中的异步通道概念是由异步通道组支持的。一个异步通道组基本上会将多个通道集中起来以供重用。异步api的使用者从组中检索一个通道(JVM默认创建一个通道),通道在完成读/写操作后自动将自己放回组中。最终,异步通道组由surprise threadpool支持。而且,异步通道是线程安全的。
支持异步通道组的线程池的大小由以下JVM属性配置
java.nio.channels.DefaultThreadPool.initialSize
以及如何在Java中实现它们
很高兴你这么问。下面是AsynchronousSocketChannel
(用于将非阻塞客户端套接字
打开到侦听服务器的示例。)此示例摘自Apress Pro Java NIO.2,由我评论:
//Create an Asynchronous channel. No connection has actually been established yet
AsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open();
/**Connect to an actual server on the given port and address.
The operation returns a type of Future, the basis of the all
asynchronous operations in java. In this case, a Void is
returned because nothing is returned after a successful socket connection
*/
Void connect = asynchronousSocketChannel.connect(new InetSocketAddress("127.0.0.1", 5000)).get();
//Allocate data structures to use to communicate over the wire
ByteBuffer helloBuffer = ByteBuffer.wrap("Hello !".getBytes());
//Send the message
Future<Integer> successfullyWritten= asynchronousSocketChannel.write(helloBuffer);
//Do some stuff here. The point here is that asynchronousSocketChannel.write()
//returns almost immediately, not waiting to actually finish writing
//the hello to the channel before returning control to the currently executing thread
doSomethingElse();
//now you can come back and check if it was all written (or not)
System.out.println("Bytes written "+successfullyWritten.get());
Edit:我应该提到JDK1.7中提供了对异步NIO的支持
问题内容: 尝试为自己总结这两个概念之间的区别(因为当我看到人们在一句话中同时使用这两个概念时,我感到非常困惑,例如“ Non-blocking async IO”,我试图弄清楚它是做什么的)意思)。 因此,以我的理解,无阻塞IO是操作系统的主要机制,如果有任何可用数据,则该OS处理IO,否则仅返回错误/不执行任何操作。 在异步IO中,您仅提供回调,当数据可用时,系统将通知您的应用程序。 那么,实
非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser
Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S
Go提供的网络接口,在用户层是阻塞的,这样最符合人们的编程习惯。在runtime层面,是用epoll/kqueue实现的非阻塞io,为性能提供了保障。 如何实现 底层非阻塞io是如何实现的呢?简单地说,所有文件描述符都被设置成非阻塞的,某个goroutine进行io操作,读或者写文件描述符,如果此刻io还没准备好,则这个goroutine会被放到系统的等待队列中,这个goroutine失去了运行权
我正在研究反应式编程,我怀疑它是否是非阻塞IO的Java REST web服务的实现。Java Servlet 3.1规范引入了一些接口,以实现非阻塞web请求。 我的问题是: Netty是否实现了该规范,而Tomcat、JBoss和Jetty没有实现 谢谢。
问题内容: 除了java.nio之外,java中还有什么用于异步io(基于套接字)的选项?java.nio还会在后台使用线程吗(就像我认为.NET的async-socket-library所做的那样,也许它已被更改),还是使用适当的select调用是“ true”的异步io? 问题答案: Java的NIO软件包(从Java6开始)通过Selector提供对非阻塞I / O的仅支持。希望Java7随