非阻塞IO与异步IO以及Java实现
尝试为自己总结这两个概念之间的区别(因为当我看到人们在一句话中同时使用这两个概念时,我感到非常困惑,例如“ Non-blocking async
IO”,我试图弄清楚它是做什么的)意思)。
因此,以我的理解,无阻塞IO是操作系统的主要机制,如果有任何可用数据,则该OS处理IO,否则仅返回错误/不执行任何操作。
在异步IO中,您仅提供回调,当数据可用时,系统将通知您的应用程序。
那么,实际上什么是“非阻塞异步IO”?以及如何在Java中实现它们(标准JDK,没有外部库,我知道有java.nio.channels.{Channels,
Selector,
SelectorKey}和java.nio.channels.{AsynchronousSocketChannel}
):非阻塞IO,异步IO和非阻塞异步IO(如果有的话)?
回答:
要回答这个问题,您必须首先了解没有 阻塞异步I / O 这样的事情。异步的概念要求没有等待,没有阻塞,没有延迟。当您看到 非阻塞异步I / O时 ,
非阻塞 位仅用于进一步限定该术语中的 异步 形容词。如此有效地, 非阻塞异步I / O 可能有点冗余。
I / O主要有两种。 和 。 ,而
Java中的异步通道的概念由异步通道组支持。异步通道组基本上会汇集多个通道以供重用。异步api的使用者从组中检索一个通道(JVM默认情况下会创建一个通道),并且该通道在完成其读/写操作后会自动将其自身放回到该组中。最终,异步通道组由支持
惊喜 ,线程池。同样,异步通道也是线程安全的。
支持异步通道组的线程池的大小由以下JVM属性配置
java.nio.channels.DefaultThreadPool.initialSize
给定一个整数值,它将设置该大小的线程池,以支持通道组。渠道组的创建和维护对开发者是透明的。
好吧,很高兴你问。这是一个示例AsynchronousSocketChannel
(用于向Socket
侦听服务器打开非阻塞客户端。)此示例摘自Apress
Pro Java NIO.2,我对此进行了评论:
//Create an Asynchronous channel. No connection has actually been established yetAsynchronousSocketChannel 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());
编辑:我应该提到对异步NIO的支持来自JDK 1.7
以上是 非阻塞IO与异步IO以及Java实现 的全部内容, 来源链接: utcz.com/qa/405490.html