同步非阻塞模式(NonBlocking IO)
在非阻塞模式中,发出Socket的 accept()
和 read()
操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息。也就是说进程发起一个read操作后,并不需要一直阻塞等待,而是马上就得到了一个结果。
如果结果发现数据准备完毕就可以读取数据,然后拷贝到用户内存。如果结果发现数据没有就绪也会返回,进程继续不断的 主动询问
数据的准备情况是非阻塞模式的一个特点。
伪代码表示如下:
{ while(read(socket,buffer)!=CCESS){ } process(buffer); }
Java同步非阻塞模式
如上所述,Java的Socket是阻塞模式的典型应用。在发起 accpet()
和 read()
请求之后会持续阻塞,但是Java中提供了 setSoTimeout()
方法设置超时时间,在固定时间内没有得到结果,就会结束本次阻塞,等待进行下一次的阻塞轮训。这是,也就实现了应用层面的非阻塞。
Java中Socket中的 setSoTimeout()
方法:
Java同步非阻塞模式编码
通过设置 setSoTimeout()
使阻塞模式的服务端 accpet()
和 read()
优化为非阻塞模式。 SocketServerNioListenAndRead.java
上面的代码可以实现监听和读取数据的非阻塞,但是还是只能一个一个的处理,可以使用多线程 稍微改进
。 SocketServerNioListenThread.java
同步非阻塞模式总结
用户需要不断地调用,尝试读取数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。
开发难度相对于阻塞IO模式较难,适合并发小且不需要及时响应的网络应用开发。
GitHub 源码:
https://github.com/niumoo/java-toolbox/
<完>