这一阵子研究JAVA7的AIO,也就是NIO2,网上有很多关于NIO1和NIO2的介绍。
简单说来,在AIO中,操作系统为我们做了更多的事情。因为操作系统更底层,所以理论上来讲效率会更高些。
AsynchronousChannelGroup可以理解为一个JVM中对于Socket相关操作的一些公共资源的代表。
一个ChannelGroup和一个(或2个)thread pool关联。
理解AsynchronousChannelGroup
首先引用PRO JAVA 7 NIO2书中的一段话,来解释一下AsynchronousChannelGroup的几个关键点。
写道
the asynchronous API introduces a class named AsynchronousChannelGroup, which presents the concept of an asynchronous channel group , in which each asynchronous channel belongs to a channel group (the default one or a specified one) that shares a pool of Java threads. These threads receive instruct ions to perform I/O events and they dispatch the results to the completion handlers. The asynchronous channel group encapsulat es thread pool and the resources shared by all the threads working for the channels. Also, the channel is in effect owned by the group, so if the group is closed, the channel is closed too.
首先,每一个asynchronous channel都属于同一个group,共享一个Java线程池
1. 从代码创建角度来看无论是AsynchronousServerSocketChannel还是AsynchronousSocketChannel的创建都使用各自的静态方法open,而open方法便需要asynchronousChannelGroup。
2. 可以发现AsynchronousChannelGroup其内部其实是一个(一些)线程池来进行实质工作的;而他们干的活就是等待IO事件,处理数据,分发各个注册的completion handlers。
其次便是NIO与NIO2的区别了
即REACTOR PROACTOR,同步IO和异步IO
在同步IO中等待IO事件由我们注册的selector来完成,在感兴趣的事情来了,我们的线程来accept.read.write.connect...干活,干好后再交由业务逻辑处理。
在异步IO中等待IO事件同样为acceptor,read,write,connect,但数据处理交由系统完成,我们需要做的就是在completion handlers中处理业务逻辑。
谁来干以前的活
是时候来想想NIO中(最朴素的),我们通常要干两件比较底层的事情
1. 弄一个seletor,在他身上注册各种感兴趣的事件,然后select,等待感兴趣的事情发生
2. 感兴趣的事情发生了,比如可以读了,这时便需要我们的线程从channel中读数据到bytebuffer里
那么在AIO里,这些都不需要了,因为系统替你做好了!
但是,系统替你做的事是2,系统级的AIO,windows下的iocp(真AIO),linux下的epoll(模拟)
那1这个事情其实还是要由java的线程去做,所以我们还是需要一个类似seletor的存在,他就是我们提供的AsynchronousChannelGroup中的线程池。
下篇中将详细讲述AsynchronousChannelGroup的创建及各自的特点。
分享到:
相关推荐
异步输入/输出(Asynchronous Input/Output,简称AIO),是计算机系统中的一种I/O操作方式,与传统的同步I/O有所不同。同步I/O在进行数据传输时会...在设计AIO框架时,理解并合理运用这些核心概念和组件是至关重要的。
5. **Asynchronous Channel Group**:在Java NIO.2中,引入了异步通道组(AsynchronousChannelGroup),用于管理一组异步通道,可以控制它们的执行策略,比如限制并发连接的数量。 6. **CompletionHandler**:异步...
在Java编程领域,NIO.2(New IO 2,也称为Java NIO 2)是Java 7引入的一组新API,它扩展了Java的I/O功能,提供了更高效和...对于想要提升Java I/O性能的开发者来说,理解和掌握NIO.2的异步通道API是至关重要的一步。
在Java中,这主要通过**AsynchronousChannelGroup**和**AsynchronousChannel**接口实现。异步I/O可以显著提高程序的响应能力,特别是在处理大量并发请求时。 与传统的I/O相比,NIO在处理大数据和高并发场景时表现出...
3. **NIO.2**:Java 7引入了新的非阻塞I/O(New I/O)API,扩展了Java的I/O能力,包括文件系统操作(如`Files`类)、异步通道(AsynchronousChannelGroup和AsynchronousSocketChannel)以及文件观察者(WatchService...
同时,NIO也是Java NIO.2(新I/O API,JDK 7引入)的基础,包括Path、Files、AsynchronousChannelGroup等高级API,都依赖于NIO的基本概念和技术。 总之,NIO的出现为Java开发者提供了更多的可能性,让我们能够以更...
Java NIO(New Input/Output)是Java标准库中...随着Java版本的更新,NIO的功能不断完善,如NIO.2引入了更高级的文件系统操作和支持异步I/O的AsynchronousChannelGroup等,进一步增强了Java在高性能和并发领域的表现。
1. 使用`AsynchronousChannelGroup`创建`AsynchronousSocketChannel`实例,该组管理线程池以处理I/O事件。 2. 调用`connect()`方法异步地建立到服务器的连接。这个方法返回一个`Future`,我们可以注册一个完成处理器...
Java NIO中没有直接实现Proactor模式,但可以通过使用java.nio.channels.AsynchronousChannelGroup和java.nio.channels.AsynchronousSocketChannel来实现类似的功能。 java.nio包中的非阻塞机制包括_channels、_...