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相關聯的通道,全部阻塞在這些通道上的線程將被喚醒。生命週期