Java IO阻塞、非阻塞、同步、异步(案例详解)

简介: 我们一起入门学习Java IO阻塞、非阻塞、同步、异步!
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿大家奔赴在各自的热爱里…

一、I/O 阻塞、非阻塞

Java面试会常常问到什么是阻塞IO和非阻塞IO?

在这里插入图片描述

我们一般根据应用程序是否阻塞自身运行,把 I/O 分为阻塞 I/O 和非阻塞 I/O

在这里插入图片描述

我知道不容易理解 所以我们对着图来一起学习一下

在这里插入图片描述
举例:A找B获取一个数据,但是此时B未将此数据准备好,要等B将数据放入缓冲区后才能获取,此时A被迫等待,这就叫阻塞IO

阻塞IO解释: 在应用调用recvfrom读取数据时,其系统调用直到数据包到达且被复制到应用缓冲区中或者发送错误时才返回,在此期间一直会等待,进程从调用到返回这段时间内都是被阻塞的称为阻塞 I/O

在这里插入图片描述
举例:A找B获取一个数据,但是此时B未将此数据准备好,A不需要一直停留等待B,A可以做自己的事情,等到B将数据准备好后,在告诉A来取数据即可,这就是非阻塞 I/O


二、I/O 同步、异步

同步和异步是针对应用程序和内核的交互而言的。

同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪。

异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。

在这里插入图片描述


由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题

举个例子:比如把一定量的数据写入磁盘,CPU输出时间很快,可是磁盘要接收速度比较慢

同步IO:CPU等着,等着程序完全写入了磁盘,再执行后续步骤;这就是同步I/O

在这里插入图片描述

异步IO:CPU不等待,自己去做自己的事情,一段时间后,当IO返回结果时,再通知CPU进行处理

在这里插入图片描述

这里就好比人去早餐店买早点一样,如果要自己点餐排队,这个就是同步;如果点完餐,自己去做自己的事情,等到早餐好了,有人通知你去取这个就是异步


三、I/O 对比小结

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
在这里插入图片描述

同步、异步:针对客户端。

阻塞、非阻塞:针对服务器。


举例:

1、比如你要去买早点,点餐,排队,所有的事情都是亲力亲为,这就是同步

2、同样是买早点,你点完餐后,自己去坐着休息,等早餐好了自己再去取,这就是异步

同步和异步站在任务调度者的角度分析问题


3、比如你要去买早餐,你点了早餐,但是早餐没做好,你被迫排队等待,不能做其它的事情,这就是阻塞

4、同样是买早点,你点完餐,但是早餐没做好,你找了个人帮你看着,你去做自己的事情,比如刷抖音,看头条,等到早餐好了你再来取用,这就是非阻塞

阻塞与非阻塞是站在CPU角度来看的


小结:一直想写这篇文章,但是因为最近的工作和生活都比较匆忙,现在两个晚上终于整理完了,温故而知新,我也有了新的收获和理解,可能一开始对很多的概念很模糊,多看看图片会很容易理解,文章很多图片来源于网络,希望可以帮助大家加深记忆和理解。
在这里插入图片描述


非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

愿你们奔赴在自己的热爱里!

目录
相关文章
|
30天前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
26天前
|
存储 Java 数据库连接
BIO阻塞IO流与数据存储大揭秘:性能与资源消耗,一文让你彻底解锁!
【8月更文挑战第25天】本文探讨了Java中BIO阻塞IO流与数据存储的概念及其实现。BIO作为一种传统IO模型,在处理每个客户端请求时需创建新线程并等待响应,这在并发量大时会导致性能下降和高资源消耗。示例代码展示了如何利用`ServerSocket`实现基于BIO的简单服务器。此外,文章还介绍了数据存储的基本方法,例如通过`BufferedWriter`向文件写入数据。两者对比显示,BIO适合连接数稳定的场景,而数据存储则适用于需要持久化保存信息的情况。通过这些分析和实例,希望能帮助读者更好地掌握这两种技术的应用场景及其优缺点。
28 0
|
29天前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
25 2
|
30天前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
30天前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流
|
23天前
|
Ubuntu Linux
内核实验(九):添加IO驱动的阻塞读写功能
本文通过修改内核模块代码,介绍了如何在Linux内核中为IO驱动添加阻塞读写功能,使用等待队列和条件唤醒机制来实现读写操作的阻塞和非阻塞模式,并在Qemu虚拟机上进行了编译、部署和测试。
10 0
|
2月前
|
开发框架 并行计算 .NET
从菜鸟到大神:Python并发编程深度剖析,IO与CPU的异步战争!
【7月更文挑战第18天】Python并发涉及多线程、多进程和异步IO(asyncio)。异步IO适合IO密集型任务,如并发HTTP请求,能避免等待提高效率。多进程在CPU密集型任务中更优,因可绕过GIL限制实现并行计算。通过正确选择并发策略,开发者能提升应用性能和响应速度。
77 3
|
2月前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
【7月更文挑战第18天】Python并发编程中,异步IO适合IO密集型任务,如异步HTTP请求,利用`asyncio`和`aiohttp`实现并发抓取,避免等待延迟。而对于CPU密集型任务,如并行计算斐波那契数列,多进程通过`multiprocessing`库能绕过GIL限制实现并行计算。选择正确的并发模型能显著提升性能。
66 2
|
2月前
|
数据采集 算法 数据处理
Python中的并发编程:异步IO与多线程对比分析
传统的多线程编程在Python中因为全局解释器锁(GIL)的存在受到限制,导致多线程并不能充分利用多核处理器的优势。本文将探讨Python中的异步IO编程与多线程编程的差异与优劣,并分析适合的应用场景。
|
2月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用