Java:什么叫做同步非阻塞IO呢?
打开IO指令执行完成后,
会继续执行指令后面的操作,
当对方返回数据后会出发一个事件,
告诉你数据回来了,
例如使用selector的非阻塞IO.你应当看看java.nio.
首先这个不是JAVA特有的概念。
同步非阻塞:同步指的是调用者程序需要等待被调用逻辑执行完毕才可以继续向下执行,阻塞指的是被调用程序逻辑不能立即返回,需要调用程序等待。“非阻塞”体现在I/O函数立即返回给调用者一个结果而不论I/O中是否含有数据。主程序需要根据每次调用I/O函数返回的值判断数据是否已经准备OK,如果可以被处理了才继续往下进行处理。(因此“其它的操作”,可以是不断轮询调用的IO函数,也可以做其它任何事情(比如我判断当前没有数据,就不处理数据了,随便干个别的事情完事- -!))
楼主之所以有疑问,是因为楼主的案例看起来都得等待IO完成才可以继续处理吧,看起来都是“阻塞”了主程序的数据处理逻辑(没有数据后续还做什么处理是吧),但事实是你可以不处理数据,做其它任何事情,因此上述IO并没有阻塞你的程序执行(IO函数没有阻塞调用者程序),只是在数据处理的逻辑上阻塞了(逻辑阻塞)。
总:楼主这个所谓“其他的操作“呢?在逻辑处理上应该是写一个轮训判断IO的数据是否OK,每一次轮训相对于是做了一个"其它操作",因为上一个时刻的函数调用并没有阻塞后一个时刻的函数调用。(注意理解“逻辑阻塞” 与 “程序阻塞”)
备注:
推荐阅读unix BIO, NIO, AIO 这是三个是本质,java Netty即其中的I/O多路复用模型实现;(B: Block 阻塞的含义, N:Non-Block, A: Async)
之所以有这么多复杂的模型,实际上都是为了节省计算机的资源,按细了说比如CPU,比如内存。其它角度看,线程也是一种比较奢侈的资源。
2017-10-10