JavaNIO的理解

JavaNIO相对传统IO,其优势主要有:

一、最大的优势就是解决了传统IO的阻塞问题。

NIO解决了accept()、read()、write()等方法的阻塞,但实际上它没有完全地解决这个问题,原因有下:

1. 传统IO 的accept()会阻塞,但NIO的select()方法也是阻塞的。

当然,NIO的优势在于它解放了你的业务线程(真正处理你业务的线程),即你可以专门创建一个阻塞线程,待该线程发现有accept事件之后,再通知业务线程做处理。

传统IO也有类似的实现,即1个守护进程来接收连接,再另外创建多线程来处理连接请求。但这个和NIO相比,1个是来者不拒,不管这个连接是做什么的一律创建一个线程来应对,1个是有事件发生了再创建线程应对,资源的有效利用率上可立见高下。

2. 传统IO的read()、write()方法是阻塞的,但NIO的read和write也并非就不阻塞

NIO的API方法read(),write()是不阻塞的,但这个不阻塞的缺点是,你读到的数据不一定是完整的,而且你也根本不知道自己读到的是不是完整的。所以,你自己的业务线程还得想办法轮循从channel中读到完整数据,如下面的代码:

                    while (true) {
                        buffer.clear();
                        len = readChannel.read(buffer);
                        System.out.println("读数据长度:"+len);
                        if (len == -1||len==0) break;
                        buffer.flip();
                        while (buffer.hasRemaining()) {
                            baos.write(buffer.get());
                        }
                    }
这又何尝不是另外一种阻塞呢?!在read方法上没阻塞,但整个线程还是阻塞在while循环直到循环结束!

当然,NIO这种阻塞相比IO来说,至少有selector帮它省掉了IO事件准备的时间,IO数据的读取还是要靠业务线程自己。传统IO在面对IO时就完全一眼前一抹黑了,发出read(),write()后就只能傻等,不知道什么时候可以操作,操作时也只能从流中一个字节一个字节地读。而在NIO引入了缓冲区Buffer,即IO操作是面向缓冲区的,相比传统的流按字节读取来说还是要快不少。




           

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值