1  什么是阻塞式和非阻塞式?

阻塞式IO:IO即input/output,阻塞式IO指的是“一旦输入/输出工作没有完成,则程序阻塞,直到输入/输出工作完成”。在目前,我们从书本上学到的语法用的基本都是阻塞式IO。比如c语言的stdio.h库的所有函数(包含scanf(),getchar(),gets()等函数),Java的BIO(比如各类输入输出流)。他们都是不见黄河心不死的好汉。在你满足他们的条件之前,不让你的程序继续往下跑。最简单的例子:c语言的scanf()函数——当你scanf()要求输入两个数字时,你只输入一个数字,它也不会让你继续执行接下来的代码的。

非阻塞式IO:非阻塞式IO其实也并非完全非阻塞,通常都是通过设置超时来读取数据的。未超时之前,程序阻塞在读写函数上;超时后,结束本次读取,将已读到的数据返回。通过不断循环读取,就能够读到完整数据了。如果多次连续超时读到空数据的话,则可以断开。C语言的Socket可以使用setsockopt()来设置recv()超时(通常也就Socket需要考虑超时)。而JAVA有两种非阻塞式IO——AIO和NIO。

有啥用:就说说非阻塞IO的严重缺点吧。如果你企图保持socket的长连接,Server在规定的时间内没有读到Client的心跳,然而你Server读取socket传来的数据,调用的输入函数是阻塞式IO(如下),那么即便Client没有心跳了(Client已经断开了连接),你的Server程序仍然会被阻塞在该输入函数下无法继续等待数据结束标志(比如换行符)。然而,由于Client已经断开了连接,所以Sever永远收不到数据……这个线程就卡在这里结束不了,单纯地浪费资源了。(这时候,心跳包机制也成了鸡肋)

2   两者区别:

用简单的生活实例类比:

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。

所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。

对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。

一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作。

如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。

java非阻塞io流_阻塞式和非阻塞io流初认识相关推荐

  1. 接收大文件流_一文搞定 Node.js 流 (Stream)

    stream(流)是一种抽象的数据结构.就像数组或字符串一样,流是数据的集合. 不同的是,流可以每次输出少量数据,而且它不用存在内存中. 比如,对服务器发起 http 请求的 request/resp ...

  2. angular8 获取文件流_基于PG12.2实现主从异步流复制及主从切换教程(上)

    概述 今天主要分享一下PG主从异步流复制搭建相关的一些理论内容,仅供参考. 一.PostgreSQL通过WAL日志构建高可靠性原理 PostgrepSQL在数据目录的子目录pg_xlog子目录中维护了 ...

  3. java如何阻塞和同步_同步与异步,阻塞与非阻塞

    今天早上关注了这个问题,刚抽出时间大概整理下,以下仅是个人理解: 一定要多看几遍代码并结合文字理解下 引0.从I/O说起 这些概念之所以容易令人迷惑,在于很多人对I/O就没有清晰准确的理解,后面的理解 ...

  4. java并行流 阻塞主线程_记一次使用Java8并行流导致的服务瓶颈问题排查

    一.业务背景# 二.服务架构# 服务使用线程池对请求进行业务处理,corePoolSize=32,maximumPoolSize=128. 三.问题描述# 服务部署到测试环境,将线上流量通过tcp-c ...

  5. JAVA中流水账的实现_流水账式java基础Summary

    来一篇java基础知识的小总结,采用流水账式,不是特意的,而是不知道用什么形式把这些东西联系起来,那就想起什么写些什么吧 关键字:java中赋予特殊含义,具有专门用途的的单词,class.public ...

  6. 接二手java项目需要什么资料_师妹问双非本科如何进BAT,我告诉她Java后端路线...

    前言 最近有很多小师妹来问我. 师妹:师兄~看了你之前的从腾讯到阿里,最后选择字节,觉得你特别厉害,请问你是怎么进BAT的呀,能不能告诉我你的学习路线呀~ 既然小师妹都这么问了,那我在这篇就如实回答她 ...

  7. python非数值型数据_利用pandas将非数值数据转换成数值的方式

    handle non numerical data 举个例子,将性别属性男女转换成0-1,精通ML的小老弟们可以略过本文~~, 这里不考虑稀疏向量的使用,仅提供一些思路.本来想直接利用pandas的D ...

  8. setstate是同步还是异步_谈谈 IO模型:同步、异步、阻塞、非阻塞

    同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...

  9. IO模型_阻塞_非阻塞_多路复用

    在了解IO模型前,先了解什么叫IO,IO得操作是怎么样的? IO既输入输出,指的是一切操作程序或设备与计算机之间发生的数据传输的过程.它分为IO设备和IO接口两个部分. IO设备:就是指可以与计算机进 ...

最新文章

  1. 【JavaSE03】Java中分支语句-练习
  2. 【渝粤题库】广东开放大学 标准化专题讲座 形成性考核
  3. sdut1197约瑟夫问题
  4. python summary_利用python爬取新闻信息
  5. mongodb----副本集搭建及故障自动切换
  6. Hibernate的Cascade——级联操作
  7. consul配置mysql集群_consul1.6实现Mysql-Gtid主从读写分离和高可用-03
  8. 常微分方程之Kutta公式、Gill公式、隐式龙格库塔公式、半隐式龙格库塔公式、Milne方法、Hamming方法、不显含一阶导数的二阶微分方程的求解方法、非线性微分方程的差分法
  9. 中医测试体质的软件,中医体质辨识软件五大功能
  10. 深度学习超参数介绍及调参
  11. mysql的explain执行计划_MySQL之Explain(执行计划)
  12. opencv python 实现图片添加带透明的 logo
  13. 书单丨流量成本越来越高,6本书带你实现爆发式增长!
  14. 《小岛经济学》八、金本位的破灭、房地产的泡沫
  15. H3C CAS 5.0 虚拟机备份与还原
  16. nginx死循环解决办法
  17. 32位谷歌浏览器的下载网址
  18. android 服务检测,Android检测某个服务是否还活着代码
  19. unity 动态字体 和 静态字体
  20. 2022-2028年中国LED灯珠行业竞争格局分析及投资发展研究报告

热门文章

  1. Visual C++ 图像处理类库CxImage源代码
  2. Linux系统下配置JDK环境变量
  3. 【Win10】【Win2D】实现控件阴影效果
  4. mysql中php生成唯一ID
  5. 女生看了别怨我啊!!!!
  6. oracle修改用户密码
  7. WSL2之kali安装界面kex
  8. Android8.1 Camera2+HAL3之HIDL open()流程(二十)
  9. FFmpeg流媒体调试工具(六)
  10. Beyond Compare Pro for Mac