Java NIO 中的Buffer和Channel了解

最近项目要实现后台长连接服务,接触了Java NIO包中的SocketChannel和Selector。

Java NIO

发布JDk1.4之后出现的。NIONew IO,提供了非阻塞IO的操作,所以有人解读为 non-blocking IO。而在之前Java传统的字节流字符流IO都是BIO*(Blocking IO)*,即阻塞IO。另外JavaSE7后增加了AIO的特性。

  • Java BIO同步并阻塞,服务器是一个连接一个线程。若请求数据很少,连接处于保存状态,浪费线程资源。适用连接数目少且固定架构,对服务器资源要求比价高,并发局限于应用中。
  • Java NIO同步非阻塞,服务器是一个请求一个线程。通过IO复用实现,客户端发送的连接请求都会注册在多路复用器上,复用器轮训到某连接有IO请求时才会启动线程处理。适用连接数目较多连接较短(轻操作)的架构,如聊天服务器,并发局限于应用中。
  • Java AIO异步非阻塞,服务器是一个有效请求一个线程。客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。适用连接数目多连接较长(重操作)的架构,如相册服务器,充分调用OS参与并发操作。

了解同步和异步、阻塞和非阻塞的概念

同步和异步:关注的点在于消息通信机制。A同步调用B,得到结果才返回A(没有得到时不反回);A异步调用B,会立马返回(没有得到结果)给A,结果由B通知A
阻塞非阻塞:关注程序等待结果时的状态。阻塞调用指在得到结果前当前线程会被挂起,直到得到结果返回;非阻塞指不能立马得到结果之前,不会阻塞线程。

怎样理解阻塞非阻塞与同步异步的区别?

重点描述下NIO实现IO复用的方式:

NIO中,每一个数据连接都可以对应为一个Channel,可以把某个Channel感兴趣的事件(可读、可写等)注册到Selector上,处理请求的线程只要检测Selector的状态就好。当Selector收到特定的事件后,执行线程可以通过Selector获取相关的Channel,进行相应的处理。此后在继续检查Selector。多个Channel事件注册到Selector上,这样就实现了一个线程的复用,处理多个Channel

Channel

Channel,译为通道、管道,是对数据的源头和数据目标点流经途径的抽象。

Java NIO 中的Buffer和Channel了解_第1张图片

根据类图可分为分为FileChannelSelectableChannel两大类。FileInputStreamFileOutputStream就使用了FileChannelSelectableChannel实际上是网络通信相关的SocketChannel等的实现基础。

按照《Java NIO》描述,可根据IO服务情况可分为:file I/Osteam I/OChannel 分类也基本如此,分别对应FileChannelSocketChannel等相关类。

Channel是同系统底层数据的交互,为了效率统一使用字节为单位。对应Socket相关的Channel使用特定类open()创建,进行bind()、connect()操作;与FileChannel相关的需要FileInputStream、FileOutputStream或者RandomAccessFile的getChannel()获取Channel对象。

两者的差别不只是对象的构建和初始化的不同,FileChannel不支持非阻塞线程模式,Selector的结合使用也不同。

你可能感兴趣的:(Java-IO)