那么,实际上什么是“非阻塞异步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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)