非阻塞IO与异步IO和Java中的实现

尝试总结自己这两个概念之间的区别(因为当我看到人们在一个句子中使用这两个概念时,我真的很困惑,比如“非阻塞异步IO”,我想弄清楚它是什么意思)。

所以,在我的理解中,非阻塞IO是主要的操作系统机制来处理IO,如果有任何数据准备就绪,否则只是返回错误/什么都不做。

在异步IO中,您只需提供回调,当数据可用时,您的应用程序将被通知。

那么实际上是什么“非阻塞异步IO”呢?并且它们如何在Java中实现(标准的JDK,没有外部的libs,我知道有java.nio.channels。{Channels,Selector,SelectorKey}和java.nio.channels。{AsynchronousSocketChannel}):非阻塞IO ,异步IO和非阻塞异步IO(如果有这样的事情)?

So what is actually “non-blocking async IO”?

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

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

异步通道组

Java中异步通道的概念由异步通道组支持。异步通道组基本上汇集了多个通道进行重用。异步api的消费者从组中检索通道(默认情况下,JVM创建一个通道),并且通道在完成其读/写操作后自动将其自身置回到组中。最终,异步通道组由惊喜,线程池支持。另外,异步通道是线程安全的。

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

java.nio.channels.DefaultThreadPool.initialSize

给定一个整数值将会建立一个这个大小的线程池,以返回通道组。否则,渠道组将被创建并保持透明度。

And how all them can be implemented in Java

嗯,我很高兴你问。这是一个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());

编辑:我应该提到,Async NIO的支持来自JDK 1.7

翻译自:https://stackoverflow.com/questions/25099640/non-blocking-io-vs-async-io-and-implementation-in-java

转载注明原文:非阻塞IO与异步IO和Java中的实现