NIO为什么被称为同步非阻塞

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以后已经有了支持






猜你喜欢

转载自blog.csdn.net/u011385186/article/details/80464725