Android NIO 系列教程(一) NIO概述

系列文章:
系列文章:
Android 网络系列更新计划
Android NIO 系列教程(一) NIO概述
Android NIO 系列教程(二) – Channel
Android NIO 系列教程(三) – Buffer

根据 英语原文 翻译过来,添加自己一些理解,英语好的,也可以直接阅读原文。

在 Socket 的教程 Android Socket 系列更新计划中,我们已经学习了 Socket 的基本使用和一些案例;但在多人聊天室中,我们已经知道,在百万级别的客户端连接时,无论服务端怎么优化,线程和IO阻塞问题已经存在;

一、NIO介绍

所以,这里我们学习一下 JDK1.4之后引入的非阻塞 IO – NIO;他们的区别如下:

  • 阻塞与非阻塞: 传统 IO 在读写时是阻塞的,即当我们在 write 或者 read 的时候,线程是阻塞的,在此期间,线程不能做其他事,直到文件的字节被全部读取完成,线程才回复空闲状态。而非阻塞则表示请求一个数据写入通道,在其期间线程还能去处理其他事,大大增大了线程的利用率;
  • 面向对象不同:传统IO面向字节流,而NIO则面向缓冲流;Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区;NIO则不同,在读写时数据存在一个 buffer 缓冲区中,可以前后移动,处理数据时只需要处理Buffer的数据即可,大大增大了灵活性。
  • Selectors:相较于传统IO,NIO 由 Selector 选择器来处理事物;即用一个线程来监视多路通道,大大减少了线程开销;后面介绍NIO模式,我们再来讨论 selector 。

Java NIO 由以下核心部分组成:

  • Channel
  • Buffer
  • Selectors

1.1、Channel & Buffer

基本上,所有NIO的IO都从一个 Channel 通道开始的,Channel 有点像流,可以从一个 Channel 读取数据到Buffer,也可以从Buffer 读数据到 Channel,如下图:
在这里插入图片描述
Channel 的种类有以下几种,包含了 TCP+UDP,网络和文件类型:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

Buffer 的类型包含以下几种基础类型:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer
    Java 的NIO还包含 MappedByteBuffer , 用于内存映射,这里没用到,就不先讨论了。

1.2、Selectors

Selectors 允许单个线程处理多个Channel ,如果你的app打开了多个连接,但每个连接的流量都很低的情况下,使用 selector 是个不错的选择,比如聊天室。
下面是是一个 selector 连接 三个 channel 的案例:
在这里插入图片描述
使用 selector 之前,得向 selector 注册 channel,然后调用它的 select() 方法;该方法会一直阻塞,直到有注册channel准备就绪,一旦该方法有返回事件,则该线程就可以去处理这些事件,包括新连接、数据接收等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章