Java网络编程——非阻塞IO(NIO)

本文深入探讨了Java中的非阻塞IO(NIO)技术,对比了阻塞型IO的局限性,阐述了非阻塞IO的核心思想,并详细讲解了Java NIO的管道技术和缓冲区Buffer的使用,为Java网络编程提供了新的解决方案。
摘要由CSDN通过智能技术生成

                          非阻塞IO(NIO)



阻塞型IO的局限

       阻塞型IO会阻塞当前线程,所以就需要创建单独的线程专门来处理这个阻塞的任务,然而Java虚拟机会为每个线程分配独立的堆栈空间以及程序计数器等资源。工作线程开得越多,系统的开销就越大,并且相应的线程之间的同步就越复杂。就算为每个阻塞的IO分配了线程,但是这些线程大部分时间都是阻塞在IO上的,Java虚拟机会频繁地进行CPU调度,而调度的就是线程,这样其实大部分的IO线程都阻塞的,不需要调度,CPU调度就会上下文切换,这样是非常浪费效率的。


非阻塞IO的思想

       非阻塞IO充分利用线程的空闲时间,比如在线程本应该阻塞的时候,非阻塞IO就可以用这段阻塞的时候做其他的事情。非阻塞IO采用轮询的方式,不断地查询有没有事件,如果有,就处理,如果没有的话,就轮询下一个事件,如果一个事件都没有,就进入阻塞状态。当有某一个事件发生,就会被唤醒进入轮询。这样,线程就像一直在工作一样,充分利用线程这一重要资源。



Java NIO管道技术

      Java从JDK1.4开始提供NIO。NIO提供了Channel接口,Channel又被称为管道,就是数据传输的通道。SelectableChannel实现了Channel接口,表示是一个可被Select的Channel。在NIO中,通过Channel向Selector注册,然后当SelectableChannel有事件发生时,就会放到Selector的一个事件集合中,在程序中通过轮询的方式去检查事件集合中有没有相应的事件,有的话就取出来处理,NIO是一个事件机制的网络编程框架,但并不是观察者回调的那种事件机制。比如在Socket服务器-客户端编程中,ServerSocketChannel继承自SelectableChannel,可以向Selector注册一个SelectionKey.OP_ACCEPT事件,也就是ServerSocket的accept方法,可以返回一个Socket连接。ByteChannel继承自Channel,表示传输字节数据的管道,SocketChannel继承自SelectableChannel并实现了ByteChannel接口,可以向Selector注册SelectionKey.OP_CONNECT表示连接就绪事件,SelectionKey.OP_READ表示管道中已经有可读的数据了,可以让程序从管道中读取数据的事件,SelectionKey.OP_WRITE写就绪事件,表示已经可以向输出流写数据了。
       SelectableChannel可以向Selector注册读写事件。SelectableChannel可以通过configBlocking(boolean block)来设置是否为阻塞模式,isBlocking()会返回SelectableChannel是不是处于阻塞模式。SelectableChannel提供了两个注册方法,SelectKey register(Selector sel,int ops)方法的第一个参数是指定注册的Selector,第二个参数是注册的事件。Sel
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值