java NIO与BIO区别

奔跑的小方 2017-02-23 05:32:43
BIO是同步的阻塞而NIO是同步非阻塞,看到一个结论:因为非阻塞 IO 处理连接是异步的,当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求“事件”,并把这个“事件”分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还,这样一个线程就可以异步的处理多个事件。而阻塞式 I/O 的线程的大部分时间都被浪费在等待请求上了。
上面提到阻塞IO大部分时间浪费在等待连接上,我认为是说ServerSocket.accept()这个方法。因为服务端必须要有连接才能和客户端进行交互。而非阻塞IO在Selector.selector()方法上也会阻塞。得到准备就绪的通道。当然可以设置立即返回,但是没有准备好的通道,也是无法和客户端进行交互的。
那么NIO较之BIO性能好在何处?

求各位大神解释下
...全文
380 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑的小方 2017-02-27
  • 打赏
  • 举报
回复
你的解释,对我理解javaNIO和javaBIO很有帮组,谢谢。
oO临时工Oo 2017-02-23
  • 打赏
  • 举报
回复
"阻塞和非阻塞的区别"不是“ServerSocket.accept()与Selector.selector()”的区别, 而是 inputstream.read()或outputstream.write()的区别; 传统阻塞IO,如果你要read/write( byte[10M])一个10M的文件,一旦调用了read/write( byte[10M])这个方法,就得等10M全部read/write,方法底层才会返回。 而非阻塞线程,调用read/write( byte[10M])方法立即返回,当然这并不能代表10M已经read/write完成,你需要检测这个byte[10M]的缓冲区。 例如

ByteBuffer buffer = ByteBuffer.allocate(10M);
int byteswrtie = inChannel.write(buffer);
while(! bufferFull(byteswrtie ) ) {
        byteswrtie = inChannel.write(buffer);
}
也许你觉得,上面的方法整个线程要等10M写完,不还是等于阻塞吗? 那看看下面的应用,你可能就理解了

ByteBuffer buffer = ByteBuffer.allocate(10M);
int[]  indexs = new indexs[100];
for(int i = 0; i < 100; i ++){
    int from = indexs[i];
    if(from > 10M){
        continue; //客户端i已经写完
    }
    int len = 1M;
    int byteswrtie = inChannels[i].write(buffer, from , len);
    indexs[i] = from + byteswrtie ;
}
上面这样,向100个客户端发10M的文件,由于各客户端网络原因,不可能一个一个地发,上面的代码可以实现100个同时发,一个给一点,直到全部给完。 java.nio.Buffer是NIO的专用缓冲区,buffer里的东西可能不会一次write完的。ByteBuffer extends Buffer

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧