非阻塞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 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());

编辑:我应该提到对异步NIO的支持来自JDK 1.7

以上是 非阻塞IO与异步IO以及Java实现 的全部内容, 来源链接: utcz.com/qa/405490.html

回到顶部