Java BIO/NIO/AIO 学习

0 引言

  本文主要介绍Java 语言IO 相关介绍。

  由上描述基本可以总结一句简短的话,同步和异步是目的,阻塞和非阻塞是实现方式。

  1. 同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。(自己上街买衣服,自己亲自干这件事,别的事干不了
  2. 异步:用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。(告诉朋友自己合适衣服的尺寸,大小,颜色,让朋友委托去卖,然后自己可以去干别的事
  3. 阻塞:当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。(去公交站充值,发现这个时候,充值员不在(可能上厕所去了),然后我们就在这里等待,一直等到充值员回来为止
  4. 非阻塞:非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。(去点餐,排队领取小票,领取完后我们自己可以玩玩手机,或者与别人聊聊天,当轮我们时,银行的喇叭会通知

1 从编程语言层面

  BIO:同步阻塞IO,一个连接一个线程

  NIO:同步非阻塞IO,一个请求一个线程

  AIO:异步非阻塞IO,一个有效请求一个线程

2 BIO

  在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。

3 NIO

  在JDK1.4及以后版本中提供了一套API来专门操作非阻塞I/O,我们可以在java.nio包及其子包中找到相关的类和接口。由于这套API是JDK新提供的I/O API,因此,也叫New I/O,这就是包名nio的由来。这套API由三个主要的部分组成:缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。

  NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 
也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

4 AIO

  在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道,其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

4.1 AIO的实现

  在windows上,AIO的实现是通过IOCP来完成的,看JDK的源代码,可以发现

扫描二维码关注公众号,回复: 6515552 查看本文章
WindowsAsynchronousSocketChannelImpl

  看实现接口:

implements Iocp.OverlappedChannel

  在linux上,AIO的实现是通过epoll来完成的,看JDK源码,可以发现,实现源码是:

UnixAsynchronousSocketChannelImpl

  看实现接口:

implements Port.PollableChannel

  这是与windows最大的区别,poll的实现,在linux2.6后,默认使用epoll。

猜你喜欢

转载自www.cnblogs.com/huanghzm/p/11024931.html