在了解BIO,NIO,AIO之前先了解一下IO的几个概念:

  1.同步

      用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪, 例如自己亲自出马持银行卡到银行取钱

  2.异步

      用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程,例如让小弟去银行帮你取钱,你可以干别的事

  3.阻塞

      当试图进读写文件的时候,发现不可读取或没东西读,则进入等待状态知道可读,ATM排队取钱

  4.非阻塞

      用户进程访问数据时,会马上返回一个状态值(可读不可读),比如在银行柜台办理业务,先取个号,然后坐在椅子上做其它事,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去,直到广播通知你去办理,(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。

  同步阻塞(JAVA BIO),每一个socket套接字需要使用一个线程来处理。建立连接、进行读写操作的时候都可能阻塞。在服务器端如果要支持并发的连接时,需要更多的线程。连接不做任何事情的时候会造成不必要的线程开销,可通过线程池来改善。

  NIO(同步非阻塞) 基于事件驱动(在程序里,程序停止在那不动,你点击一个按钮,它就有反应了,过一会,又没反应了,你再点一下,它又继续运行),采用的Reactor模式,(Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。)Reactor会处理所有客户端的Socket套接字的事件,然后派发到不同的线程中。这样就解决了BIO中为了支撑更多的Socket套接字而需要更多的线程。

  AIO(异步非阻塞)AIO采用了Proactor模式,AIO与NIO的不同之处在于当AIO在进行读写操作时,不用先等通知,可直接调用相应的read/write方法,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序,而NIO的通知是发生在动作之前的,是在可读、写的时候,Selector发现了这些事件后调用Handler处理

最新文章

  1. 纯CSS实现JS效果研究
  2. JAVA Hibernate别名排序问题
  3. i春秋30强挑战赛pwn解题过程
  4. Centos6.5下一个Ceph存储集群结构
  5. 因子分析&主成分分析
  6. 论文笔记(6):Weakly-and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation
  7. java语言环境jdk的安装和环境变量的配置
  8. 指令汇B新闻客户端开发(六) 浅谈屏幕适配解决方案
  9. 如何在你的项目中集成 CAP【手把手视频教程】
  10. WebApiClient的接口输入验证
  11. Python内置函数(12)——compile
  12. C#利用VUDP.cs开发网络通讯应用例程
  13. .net core 使用 ef core
  14. 转:centos查看实时网络带宽占用情况方法
  15. HNOI2019 多边形 polygon
  16. Azure SQL 数据库仓库Data Warehouse (3) DWU
  17. Human Interface Device (HID) Class Decoder
  18. Android实现录音的方法(最重要的是对MediaRecorder的试用方法)
  19. 哈希表-java
  20. 创建DB2数据库联合对象

热门文章

  1. webpack实用配置总结
  2. Class doesn't implement Cloneable之怪象
  3. 一致性Hash简单介绍和使用
  4. 升级到Scriptcase 8.0的注意事项
  5. kubernetes-handbook 阅读笔记
  6. 九度OJ 1089:数字反转 (数字反转)
  7. root无权限删除 原因 进程 占用 文件
  8. Go怎么获取当前时间? Go ARM64 vDSO优化之路
  9. mysql-test-run.pl
  10. appcompat_v7出现红叉解决方法