码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-04 14:48:55      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:font   res   最大数   其它   nts   索引   完成   相关   array   

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缓冲区

标签:font   res   最大数   其它   nts   索引   完成   相关   array   

原文地址:https://www.cnblogs.com/xiaojians/p/12631503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!