【高頻面試題】 介紹一下你對NIO的理解

一、NIO原理

1、緩衝區

緩衝區其實就是一個數組,讀取和寫入都會用到緩衝器。最常用的就是ByteBuffer

2、通道

通道傳輸的數據是基於緩衝區的,不能直接對通道就行寫或讀的操作。通道和流的不同之處通道是雙向的。

當讀或寫的事件發生時,可以從Selector獲取SelectionKey,同時從key中找到發生的事件和具體的selectableChannel`

3、選擇器

selector類似一個觀察者,當有事件發生的時候,它會通知,傳回一組selectionKey,從而定位到通道,獲取數據。

selector原理是對註冊的key進行輪詢訪問,當有事件發生的時候,就會通過Selector.select()方法進行獲取事件

 

二、NIO與IO的區別

1、面向不同

IO是面向流的,當開始讀取數據的時候,每次可以讀取1個或者多個字節,直至讀取完畢。之後不能移動前後的數據。

NIO是面向緩衝的,它會存到緩衝區中,可以移動前後的數據。這樣的目的是確保當數據寫入的時候,緩衝區中存在的數據不會被覆蓋。

2、方式不同

一個是阻塞IO,一個是非阻塞IO

Java中各種流都是阻塞的。意味着當線程調用read()/write()方法的時候,線程會一直阻塞等待數據,在此期間,什麼事情都做不了。

非阻塞IO  在讀取的時候,如果沒有可用的數據,則什麼都不會獲取。而不是一直阻塞,直至可以讀取數據之前,該線程可以繼續做其他的事情。

寫數據的時候同理。所以一個單獨的線程可以管理多個輸入輸入的通道。

3、特有的選擇器

NIO的選擇器允許一個單獨的線程監視多個輸入通道,你可以註冊多個通道到一個選擇器

channel和selector聯合使用,必須要將channel註冊到selector上,通過register()方法來實現。

只要Channel向selector註冊了某個特定的事件,selector就會監聽這些時間是否發生,一旦發生便會通知channel。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章