同步与异步(synchronous/asynchronous)
- 同步: 调用方法之后,必须要得到一个返回值
- 异步: 调用方法之后,没有返回值,但是会有回调函数,回调函数指的是满足条件之后会自动执行的方法
阻塞与非阻塞
- 阻塞:如果没有达到方法的目的,就会一直停在那里(等待) , 例如: ServerSocket的accept()方法
- 非阻塞: 不管方法有没有达到目的,都直接往下执行(不等待)
NIO
- 这是一个面向块的I/O系统,系统以块的方式处理数据
- NIO之所以是同步,是因为它的accept/read/write方法的内核I/O操作都会阻塞当前线程
- NIO的三个主要组成部分:Buffer(缓冲区)、Channel(通道)、Selector(选择器)
Buffer(缓冲区)
Buffer是一个对象,它是对某种基本类型的数组进行了封装
: 在NIO中,就是通过 Buffer 来读写数据的。所有的数据都是用Buffer来处理的,它是NIO读写数据的中转池, 通常使用字节数组。
Buffer主要有如下几种:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Channel(通道)
Channel是一个对象,可以通过它读取和写入数据,
可以把它看做是IO中的流,不同的是:Channel是双向的, Channel对象既可以调用读取的方法, 也可以调用写出的方法 。
Channel 的分类在Java NIO中的Channel主要有如下几种类型:
- FileChannel:从文件读取数据的 输入流和输出流
- DatagramChannel:读写UDP网络协议数据 Datagram
- SocketChannel:读写TCP网络协议数据 Socket
- ServerSocketChannel:可以监听TCP连接 ServerSocket
Selector(选择器)
选择器Selector是NIO中的重要技术之一。它与SelectableChannel联合使用实现了非阻塞的多路复用。使用它可以节省CPU资源,提高程序的运行效率。
"多路"是指:服务器端同时监听多个“端口”的情况。每个端口都要监听多个客户端的连接。
使用了多路复用,只需要一个线程就可以处理多个通道,降低内存占用率,减少CPU切换时间,在高并发、高频段业务环境下有非常重要的优势
: Selector被称为:选择器,也被称为:多路复用器,可以把多个Channel注册到一个Selector选择器上, 那么就可以实现利用一个线程来处理这多个Channel上发生的事件,并且能够根据事件情况决定Channel读写。这样,通过一个线程管理多个Channel,就可以处理大量网络连接了, 减少系统负担, 提高效率。因为线程之间的切换对操作系统来说代价是很高的,并且每个线程也会占用一定的系统资源。所以,对系统来说使用的线程越少越好。作用: 一个Selector可以监听多个Channel发生的事件, 减少系统负担 , 提高程序执行效率
.
NIO 2
- 引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制