java Nio

java Nio的组成java

Buffer安全

Channelsocket

Selector编码

Buffer就是缓冲区,Channel读写数据的存放地,在IO中咱们读取数据采用的是stream,不能重复读取,一次性读完,可是buffer不是一次性读完的,使用时必须使用while循环不断的判断buffer里面是否还存在数据。buffer的存在读模式和写模式。操作系统

Channel分为两类,一类是fileChannel,只能工做在阻塞模式;一类是socketChannel,能够选择工做在非阻塞模式或者阻塞模式,与selector使用时必须得配置在非阻塞模式,否则会爆出异常。Channel的生命周期:新建,使用,关闭。channel的新建能够经过channels.open()的方法实现,可是fileChannel的是实现只能在fileStream中打开。Channel的关闭能够经过Channel.close()方法,关闭后,链接将丢失,通道将不可用。close()方法是一个阻塞方法,且同步。若一个通道是一个InterruptibleChannel时,当线程在该通道上发生中断或者中断标志位被设立,则通道关闭,线程抛出异常。当通道关闭时,全部阻塞在该通道上的线程将wakeUp,并抛出异常。线程

Selector是多路复用选择器,进行就绪检查并通知,线程安全,可是它的selectionKey集合并非线程安全的,多个线程访问这些集合时须要使用同步。Selector的生命周期:新建,注册通道,使用关闭。选择器的建立基于操做系统,经过spi来实现的。经过channel.register()方法将通道与Selector关联起来,关联关系采用SelectionKey来抽象,一个SelectionKey包含两个以整数编码的比特掩码,一个表示通道感兴趣的操做,一个表示已经准备好的操做。一个Selector的维护三个键集合:感兴趣键,已经选择的键,已经取消的键;Selector.select()该方法是一个阻塞方法,当操做系统没有IO操做,线程将进行阻塞直到有操做进行。阻塞在select()方法上的线程能够经过Selector.wakeup()方法消除阻塞,当wakeUp()时线程已经进行完了select()操做,则将取消下一次调用select()的阻塞。Selector.close()方法将关闭全部与该Selector相关联的通道,全部阻塞在这些通道上的线程将被唤醒。生命周期

相关文章
相关标签/搜索