NIO:同步异步和阻塞非阻塞 buffer缓冲区

Posted xiaojians

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NIO:同步异步和阻塞非阻塞 buffer缓冲区相关的知识,希望对你有一定的参考价值。

NIO的引入

多路非阻塞高速网络IO通道

同步和异步

这个概念其是对于程序运行结果的获得方式而言:

同步:在没有获得结果之前或通过轮询的方式不断地询问结果是否产生,在得到结果之前不会返回

异步:调用者在发出调用之后,直接返回没有结果,等待被调用者产生结果之后通过状态通知调用者已完成,在通过回调函数返回结果

 

阻塞和非阻塞

阻塞:在执行进程时,在没有得到结果之前,这个进程暂时被挂起,不进行任何操作

非阻塞:在没有得到结果之前,该线程不会停止操作,即不会阻塞当前线程;

 

Buffer类(缓冲区)

概念:Buffer是一个对象,它对某种基本类型的数组进行了封装。NIO开始使用的Channel(通道)就是通过
Buffer 来读写数据的。 (它的实质是数组)

使用步骤

使用 Buffer 读写数据一般遵循以下四个步骤:
1.写入数据到 Buffer
2.调用 flip() 方法;(将limit=position,position=0,丢弃Mark)更改buffer的读写模式
3.Buffer 中读取数据;
4.调用 clear() 方法或者 compact() 方法。 (clear:limit=paracity(容量),position=0,丢弃Mark)

Buffer的种类

Buffer主要有如下几种:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffe

ByteBuffer类内部封装了一个byte[]数组,并可以通过一些方法对这个数组进行操作。
创建ByteBuffer对象
方式一:

在堆中创建缓冲区:allocate(int capacity)    capacity缓冲区的容量
在堆中创建缓冲区称为:间接缓冲区
方式二:

在系统内存创建缓冲区:allocatDirect(int capacity)

在系统内存创建缓冲区称为:直接缓冲区
间接缓冲区的创建和销毁效率要高于直接缓冲区
间接缓冲区的工作效率要低于直接缓冲区
方式三:

通过数组创建缓冲区:wrap(byte[] arr)
此种方式创建的缓冲区为:间接缓冲区

向缓冲区添加元素

  1. public ByteBuffer put(byte b):向当前可用位置添加数据。
  2. public ByteBuffer put(byte[] byteArray):向当前可用位置添加一个byte[]数组
  3. public ByteBuffer put(byte[] byteArray,int offset,int len):添加一个byte[]数组的一部分

 

缓冲区中的几个参数

容量-capacity
Buffer的容量(capacity)是指:Buffer所能够包含的元素的最大数量。定义了Buffer后,容量是不
可变的。

限制-limit
限制limit是指:第一个不应该读取或写入元素的index索引。缓冲区的限制(limit)不能为负,并且
不能大于容量。
有两个相关方法:
public int limit():获取此缓冲区的限制。
public Buffer limit(int newLimit)
:设置此缓冲区的限制

位置-position
位置position是指:当前可写入的索引。位置不能小于0,并且不能大于"限制"
有两个相关方法:
public int position():获取当前可写入位置索引。
public Buffer position(int p)
:更改当前可写入位置索引。

 

标记-mark
标记mark是指:当调用缓冲区的reset()方法时,会将缓冲区的position位置重置为该索引。不能
0,不能大于position
相关方法:
public Buffer mark():设置此缓冲区的标记为当前的position位置。

 

常用方法

其它方法
public int remaining():获取positionlimit之间的元素数。
public boolean isReadOnly():获取当前缓冲区是否只读。
public boolean isDirect():获取当前缓冲区是否为直接缓冲区。

#常用方法
public Buffer clear():还原缓冲区的状态。
position设置为:0
将限制limit设置为容量capacity
丢弃标记mark
public Buffer flip():缩小limit的范围。
limit设置为当前position位置;
将当前position位置设置为0
丢弃标记。
public Buffer rewind():重绕此缓冲区。
position位置设置为:0
限制limit不变。
丢弃标记。

 

以上是关于NIO:同步异步和阻塞非阻塞 buffer缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

IO NIO

Java NIO的基本概念ChannelBufferSelector以及非阻塞网络通信案例

阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定

BIO NIO AIO 学习笔记

NIO高级编程与Netty入门

彻底理解同步 异步 阻塞 非阻塞