1. 概念
同步和异步的概念:实际的I/O操作
同步是用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行
异步是用户线程发起I/O请求后仍需要继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数
阻塞和非阻塞的概念:发起I/O请求
阻塞是指I/O操作需要彻底完成后才能返回用户空间
非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成
ok,下面来分析NIO
2. 为什么被称为同步?
首先个人觉得网络I/O的同步异步的概念不是很同与普通的同步异步。
普通的同步异步:是站在更高的概念上,请求者能不能在不依靠被请求者的返回值继续向下执行
网络I/O的同步异步:是否需要等待内核的I/O操作
NIO之所以是同步,是因为它的accept/read/write方法的内核I/O操作都会阻塞当前线程
3. 为什么被称为非阻塞?
NIO在发起读请求以后,不会立即拿到结果
它的发起请求这一步,不会阻塞请求者的线程。会通过不断的轮询,来实现获取已经准备好内核I/O操作的流。
4. 那么什么情况下I/O操作就算是一个异步非阻塞呢?
在我理解,就是注册read事件后,不需要再在线程中做read操作,而是直接就能拿到read的结果。
事实上异步的I/Ojava7以后已经有了支持