非阻塞IO与异步IO以及Java实现

非阻塞IO与异步IO以及Java实现,第1张

阻塞IO与异步IO以及Java实现

那么,实际上什么是“非阻塞异步IO”?

要回答这个问题,您必须首先了解没有 阻塞异步I / O 这样的事情。异步的概念要求没有等待,没有阻塞,没有延迟。当您看到 非阻塞异步I / O时
非阻塞 位仅用于进一步限定该术语中的 异步 形容词。如此有效地, 非阻塞异步I / O 可能有点冗余。

I / O主要有两种。 同步异步同步会阻塞当前执行线程,直到处理完成为止 ,而
异步不会阻塞当前执行线程,而是将控制权传递给OS内核进行进一步处理。 然后,当提交的任务完成时,内核会通知异步线程


异步通道组

Java中的异步通道的概念由异步通道组支持。异步通道组基本上会汇集多个通道以供重用。异步api的使用者从组中检索一个通道(JVM默认情况下会创建一个通道),并且该通道在完成其读/写 *** 作后会自动将其自身放回到该组中。最终,异步通道组由支持
惊喜线程池。同样,异步通道也是线程安全的。

支持异步通道组的线程池的大小由以下JVM属性配置

java.nio.channels.DefaultThreadPool.initialSize

给定一个整数值,它将设置该大小的线程池,以支持通道组。渠道组的创建和维护对开发者是透明的。


以及如何用Java实现它们

好吧,很高兴你问。这是一个示例

AsynchronousSocketChannel
(用于向
Socket
侦听服务器打开非阻塞客户端。)此示例摘自Apress
Pro Java NIO.2,我对此进行了评论:

//Create an Asynchronous channel. No connection has actually been established yetAsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open();Void connect = asynchronousSocketChannel.connect(new InetSocketAddress("127.0.0.1", 5000)).get();//Allocate data structures to use to communicate over the wireByteBuffer helloBuffer = ByteBuffer.wrap("Hello !".getBytes());//Send the messageFuture<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 threaddoSomethingElse();//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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5478683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存