BIO 和 NIO
一、阻塞(Block)和非阻塞(NonBlock)
阻塞和非阻塞是進程在訪問數據的時候,數據是否準備就緒的一種處理方式,當數據沒有準備的時候阻塞:
阻塞:往往需要等待缞沖區中的數據準備好過后才處理其他的事情,否則一直等待在那里。
非阻塞:當我們的進程訪問我們的數據緩沖區的時候,如果數據沒有準備好則直接返回,不會等待。如果數據已經準備好,也直接返回
二、BIO與NIO
1、區別
2、Java NIO和IO之間第一個最大的區別是,IO是面向流的而NIO是面向緩沖區的
3、阻塞與非阻塞原因:
(1)Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。?
(2)Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。?
4、BIO讀文件方式
?
?5、NIO簡介:核心對象需要掌握:緩沖區(Buffer)、通道(Channel)、選擇器(Selector)。
(1)緩沖區(Buffer)
緩沖區實際上是一個容器對象,更直接的說,其實就是一個數組,在NIO庫中,所有數據都是用緩沖區處理的。在讀取數據時,它是直接讀到緩沖區中的; 在寫入數據時,它也是寫入到緩沖區中的;任何時候訪問 NIO 中的數據,都是將它放到緩沖區中。
在NIO中,所有的緩沖區類型都繼承于抽象類Buffer,最常用的就是ByteBuffer
1)其中的四個屬性的含義分別如下:
容量(Capacity):緩沖區能夠容納的數據元素的最大數量。這一個容量在緩沖區創建時被設定,并且永遠不能改變。
上界(Limit):緩沖區的第一個不能被讀或寫的元素。或者說,緩沖區中現存元素的計數。
位置(Position):下一個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函數更新。
標記(Mark):下一個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函數更新。
2)Buffer的常見方法如下所示:
flip(): 寫模式轉換成讀模式
rewind():將 position 重置為 0 ,一般用于重復讀。
clear() :清除
compact(): 將未讀取的數據拷貝到 buffer 的頭部位。
mark(): reset():mark 可以標記一個位置, reset 可以重置到該位置。
Buffer 常見類型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。
3)緩沖區存取數據流程
存數據時position會++,當停止數據讀取的時候
調用flip(),此時limit=position,position=0
讀取數據時position++,一直讀取到limit
clear() 清空 buffer ,準備再次被寫入 (position 變成 0 , limit 變成 capacity) 。
(2)通道Channel
1) 通道是一個對象,通過它可以讀取和寫入數據
2)使用NIO讀取數據
在前面我們說過,任何時候讀取數據,都不是直接從通道讀取,而是從通道讀取到緩沖區。所以使用NIO讀取數據可以分為下面三個步驟:
3)使用NIO寫入數據
使用NIO寫入數據與讀取數據的過程類似,同樣數據不是直接寫入通道,而是寫入緩沖區,可以分為下面三個步驟:
(3)Selector
1)在老IO中,serverSocket和socket都是阻塞式的,因此一旦有大規模的并發行為,而每一個訪問都會開啟一個新線程。這時會有大規模的線程上下文切換操作(因為都在等待,所以資源全 都被已有的線程吃掉了),這時無論是等待的線程還是正在處理的線程,響應率都會下降,并且會影響新的線程。
2)jdk1.4后,引入NIO,工作原理
NIO的工作原理:
1.由一個專門的線程來處理所有的IO事件,并負責分發。
2.事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。
3.線程通訊:線程之間通過wait,notify等方式通訊。保證每次上下文切換都是有意義的。減少無謂的線程切換。
NlO中實現非阻塞IO的核心設計Selector,Selector就是注冊各種IO事件的地方,而且當那些事件發生時,就是這個對象告訴我們所發生的事件。
當有讀或者寫等任何注冊的事件發生時,可以從Selector中獲得相應的SelectionKey,同時從SelectionKey中可以找到發生的事件和該事件所發生的具體的SelectableChannel,以獲得客戶端發送過來的數據。
使用NIO中非阻塞IO編寫服務器處理程序,有三個步驟
1.向Selector對象注冊感興趣的事件
2.從Selector中獲取感興趣的事件
3.根據不同事件進行相應的處理
?BIO ServerSocket
?NIO ServerSocketChannel
?AIO AsynchronousServerSocketChannel? :異步非阻塞的IO
原文連接:https://blog.csdn.net/charjay_lin/article/details/81810922
轉載于:https://www.cnblogs.com/dongtian-blogs/p/10735027.html
總結
- 上一篇: 了解vue里的Runtime Only和
- 下一篇: Spring restful