BIO、NIO、AIO

首先理解BIO、NIO、AIO是什么东西。

Java中的BIO、NIO、AIO是Java语言对操作系统各种IO模型的封装。我们在使用这些API的时候,不用关心操作系统层面的知识,也不用根据不同的操作系统写不同的代码。在讲之前,先讲一下同步、异步、阻塞、非阻塞的概念。

同步:发起一个调用后,被调用者未处理完请求前,调用不返回

异步:发起一个调用后,立即得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,之后被调用者通过回调等机制通知调用者返回结果。

同步和异步最大的区别在于异步调用,调用者不必等待被调用者返回结果,被调用者会通过回调等机制通知调用者结果。

阻塞:

举个生活中的例子:烧水时,一直傻等着水开,是同步阻塞。去干其他事情,然后时不时看下水是不是开了,是同步非阻塞。买个水开后水壶会发出声音的水壶,水开之后,水壶发出声音,这个时候再去倒水,这是异步非阻塞。

BIO:同步阻塞IO

在JDK1.4之前,只有BIO。BIO原理是:服务器通过一个Acceptor线程监听客户端请求,并为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。假如客户端数量很多,频繁地创建和销毁线程会给服务器带来很大的压力。后改良为用线程池替代新增线程。

BIO通过ServerSocket和Socket完成套接字通道的实现,客户端和服务端连接需要三次握手,使用简单,但吞吐量小。

NIO:同步非阻塞IO

在JDK1.4中引入了NIO。客户端和服务器之间通过Channel通信。这些Channel都会被注册到Selector多路复用器上。Selector通过一个线程不停地轮询这些Channel,找出已经准备就绪的Channel进行IO操作。NIO提供了Channel、Selector、Buffer等抽象。

Channel:通道。和流不同,通道是双向的。NIO可以通过Channel进行数据的读、写和同时读写操作。

Selector:多路复用器。Selector会不停地轮询注册在其上的通道,如果某个通道处于就绪状态,就会被Selector轮询出来,从而进行后续的IO操作。服务器端只要提供一个线程负责Selector的轮询,就可以接入成千上万的客户端,这是NIO的巨大进步。

Buffer:缓冲区。BIO是将数据直接写入或者读取到流对象中,而NIO的数据操作都是在缓冲区中进行的。缓冲区实际上是一个数组。

NIO通过SocketChannel和ServerSocketChannel完成套接字通道的实现,客户端和服务器通过Channel连接,采用多路复用器轮询注册的Channel。提高吞吐量和可靠性。

AIO:异步非阻塞IO

AIO没有采用NIO的多路复用器,而是使用异步通道的概念,提供了异步文件通道和异步套接字通道的实现。

AIO通过AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道的实现。

但是实际项目中一般不用jdk原生的api,而是用netty api。原因是

原文地址:https://www.cnblogs.com/koushr/p/5873464.html