IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)

简介: 简介同步非阻塞模式

同步非阻塞模式(NonBlocking IO)

在非阻塞模式中,发出Socket的 accept()read()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息。也就是说进程发起一个read操作后,并不需要一直阻塞等待,而是马上就得到了一个结果。

如果结果发现数据准备完毕就可以读取数据,然后拷贝到用户内存。如果结果发现数据没有就绪也会返回,进程继续不断的 主动询问数据的准备情况是非阻塞模式的一个特点。

微信图片_20220221170742.png伪代码表示如下:

{
 while(read(socket,buffer)!=CCESS){
 }
 process(buffer);
}

Java同步非阻塞模式

如上所述,Java的Socket是阻塞模式的典型应用。在发起 accpet()read()请求之后会持续阻塞,但是Java中提供了 setSoTimeout()方法设置超时时间,在固定时间内没有得到结果,就会结束本次阻塞,等待进行下一次的阻塞轮训。这是,也就实现了应用层面的非阻塞。

Java中Socket中的 setSoTimeout()方法:

微信图片_20220221171357.png

Java同步非阻塞模式编码

通过设置 setSoTimeout()使阻塞模式的服务端 accpet()read()优化为非阻塞模式。 SocketServerNioListenAndRead.java

微信图片_20220221171533.png

微信图片_20220221171711.png

微信图片_20220221171759.png

上面的代码可以实现监听和读取数据的非阻塞,但是还是只能一个一个的处理,可以使用多线程 稍微改进。 SocketServerNioListenThread.java

微信图片_20220221172000.png微信图片_20220221172109.png微信图片_20220221172209.png微信图片_20220221172258.png

同步非阻塞模式总结

用户需要不断地调用,尝试读取数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

开发难度相对于阻塞IO模式较难,适合并发小且不需要及时响应的网络应用开发。

GitHub 源码:

https://github.com/niumoo/java-toolbox/

<完>

相关文章
|
2月前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
115 4
网络协议与IO模型
|
2月前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
23 3
|
2月前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
44 3
|
2月前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
242 12
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
52 2
|
4月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
4月前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流