NIO:同步式非阻塞IO流
同步–同一个对象或者一段逻辑在同一个时间只允许一个 线程使用
非阻塞–一个线程在没有获取结果也会执行后面的逻辑。
1 缓冲区Buffer:底层是基于数组来进行存储
针对基本类型进行存储 Buffer针对基本类型来进行存储:ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer,CharBuffer
//表示给底层的字节数组指定大小 缓冲区给定后不可变
ByteBuffer buffer =ByteBuffer.allocate(10);
System.out.println(buffer.position());
buffer.put("abc".getBytes());
buffer.put("def".getBytes());
// buffer.flip(); 等同于buffer.limit(buffer.position());
// buffer.position(0);
buffer.flip();
// buffer.limit(buffer.position());
// buffer.position(0);
//
// buffer.hasRemaining()等同于buffer.position()<buffer.limit()
while (buffer.hasRemaining()){
byte b=buffer.get();
System.out.println(b);
Capacity: 定义缓存区容量
Limit:限定位 限定position能到达的最大下表
Position:操作位:用于标记读写位置,读到哪位,position自定挪到哪位。
2 通道区Channel:面向Buffer进行操作,用于传输数据,,允许双向传输
3选择器拦截器Selector:程序设计一般在服务端
BlockingQueue - 阻塞式队列
1 FIFO 先进先出
2容量是固定的,不可扩容
3阻塞:如果队列为空,获取元素的线程阻塞 。队列已满,往里面放的元素阻塞
4 不允许里面的元素为null
5 适用于生产消费模型
6重要方法
抛出异常 返回特殊值 永久阻塞 定时阻塞
添加 add - IllegalStateException offer - false put offer
获取 remove - NoSuchElementException poll - null take poll
常用类:
1 ArrayBlockingQueue - 阻塞式顺序队列:
基于数组
使用时要指定容量
LinkedBlockingQueue - 阻塞式链式队列:
底层必然基于节点来存储数据
在使用的时候可以指定容量也可以不指定。如果指定容量,则容量不可变;如果不指定容量,则容量默认为Integer.MAX_VALUE = 231-1不可变。因为实际开发中,一般不会在队列中存储21亿个元素,所以一般认为此时的容量是无限的
PriorityBlockingQueue - 具有优先级的阻塞式队列:
底层是基于数组来存储元素
使用的时候可以指定容量也可以不指定。如果不指定则默认初始容量是11
PriorityBlockingQueue会对放入的元素来进行排序,要求元素对应的类实现Comparable接口,覆盖compareTo方法指定比较规则
PriorityBlockingQueue在迭代遍历的时候不保证排序
SynchronousQueue - 同步队列 - 在使用的时候不需要指定容量,容量默认为1且只能为1