首页 > 自考资讯 > 自考知识

javanio是啥有什么用,java中nio和io区别

头条共创 2024-07-05

1、同步阻塞式IO(BIO)

表示服务器创建一个ServerSocket,客户端使用该Socket连接到那个ServerSocket,ServerSocket接收Socket连接请求,并创建一个Socket和一个线程来与那个Socket进行通信。

然后客户端和服务器套接字执行同步阻塞通信,服务器套接字必须等到操作完成才能返回。不是吧,这不就是同步吗?

这种方法最大的缺陷是每次客户端访问时,服务器端都要创建一个线程来为客户端服务。当大量客户端到来时,这可能会导致服务器上的线程数达到数千个。这会导致服务器端程序过载并最终崩溃并退出。

您所要做的就是构建一个线程池并固定处理请求的线程数量,但如果您有大量并发请求,则可能会导致大量排队和延迟,因为没有那么多线程可以处理。处理他们。

da785bb277254e67bc48407eb303c004~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720719946&x-signature=FtuBlF5vUZzy7IWx9EXw8IL%2F0fo%3D不是针对网络编程模型的,而是针对文件IO操作的。这是因为当你使用BIO流读写文件时,你启动一个IO请求,它就直接挂掉了,你必须等到IO完成。返回完成。

磁盘文件、FileInputStreams 和BIO 的IO 读取和写入会停止,直到读取和写入完成。

2、同步非阻塞IO(NIO)

NIO与原始IO的作用和用途相同,但用法完全不同,支持非阻塞、面向缓冲区、基于通道的IO操作。

7a9443525f9445638654a32f11f10f25~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720719946&x-signature=znQkz%2BNa7GuvXCMdznxNnr%2BJH%2B0%3D 选择器俗称选择器,也译为多路复用器。

正在连接

接受(准备接受)

写(准备写)

多路复用可以理解为只负责接收数据并放入执行队列,然后由执行器处理并直接返回。

ad1c7e915f6945c79b1688fb27a3dcca~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720719946&x-signature=CQ88ATREIgByK7adDVCrxLxYFpY%3D 多路复用器选择器是NIO 的基础,可持续轮询已注册的通道以进行访问、读取和连接。对于写事件,通道处于就绪状态并由选择器轮询。然后可以通过I/O操作的SelectionKey获取就绪通道。多路复用器可以同时轮询多个通道,并且可以通过这种机制连接数千个客户端。

这里的关键是客户端不必不断发送请求并浪费线程。所以NIO的优化思路是每次请求一个线程。仅当客户端发送请求时才会启动线程进行处理。处理完毕后,关闭工作线程。

那么为什么它是非阻塞的呢?

无论有多少个客户端可以访问服务器,客户端访问都不会消耗线程,因此选择器线程只需创建一个连接并将其注册到选择器,选择器会不断轮询所有套接字连接并在收到检测事件时更新它们。接下来,启动一个线程来处理请求。但在处理过程中,必须先读取数据,然后返回。这是一个同步过程。

例如,如果通过NIO的FileChannel启动一个文件IO操作,启动后实际上会返回。它是非阻塞的,但需要不断轮询操作系统来检查IO 操作。已经结束了吗?

3、异步IO(AIO)

是经典的reactor设计模式,也称为异步非阻塞IO。

连接发送的每个请求都绑定到一个缓冲区,该缓冲区告诉操作系统异步完成读取。此时程序读取完数据后回调。该接口提供由操作系统异步读取的数据。

NIO现在已经很常用了,正如上面提到的,NIO支持面向缓冲区、基于通道的IO操作。我们如何使用缓冲区?

我会在下一节进行讲解,欢迎关注我,免费学习更多技术知识。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢