11 Java 網絡IO編程總結(BIO、NIO、AIO均含完整實例代碼)

Java 網絡IO編程總結(BIO、NIO、AIO均含完整實例代碼)編程

 

 

BIO、NIO、AIO的基本定義與類比描述:網絡

  • BIO (Blocking I/O):同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。這裏使用那個經典的燒開水例子,這裏假設一個燒開水的場景,有一排水壺在燒開水,BIO的工做模式就是, 叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理下一個水壺。可是實際上線程在等待水壺燒開的時間段什麼都沒有作。異步

  • NIO (New I/O):同時支持阻塞與非阻塞模式,但這裏咱們以其同步非阻塞I/O模式來講明,那麼什麼叫作同步非阻塞?若是還拿燒開水來講,NIO的作法是叫一個線程不斷的輪詢每一個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操做。操作系統

  • AIO ( Asynchronous I/O):異步非阻塞I/O模型。異步非阻塞與同步非阻塞的區別在哪裏?異步非阻塞無需一個線程去輪詢全部IO操做的狀態改變,在相應的狀態改變後,系統會通知對應的線程來處理。對應到燒開水中就是,爲每一個水壺上面裝了一個開關,水燒開以後,水壺會自動通知我水燒開了。.net

進程中的IO調用步驟大體能夠分爲如下四步: 線程

  1. 進程向操做系統請求數據 ;對象

  2. 操做系統把外部數據加載到內核的緩衝區中; blog

  3. 操做系統把內核的緩衝區拷貝到進程的緩衝區 ;進程

  4. 進程得到數據完成本身的功能 ;get

當操做系統在把外部數據放到進程緩衝區的這段時間(即上述的第二,三步),若是應用進程是掛起等待的,那麼就是同步IO,反之,就是異步IO,也就是AIO 。

 

從編程模式上來看AIO相對於NIO的區別在於,NIO須要使用者線程不停的輪詢IO對象,來肯定是否有數據準備好能夠讀了,而AIO則是在數據準備好以後,纔會通知數據使用者,這樣使用者就不須要不停地輪詢了。

 

http://blog.csdn.net/anxpp/article/details/51512200

 

https://mp.weixin.qq.com/s/lZGL6Tpb2Lpd3EvqnB-0ig

 

https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247483922&idx=1&sn=c9fdc5cd64df5a412b9dc2fc6f9e4880&chksm=e8fe9e1bdf89170d9f0d08dc0320b15238869dd6c8b9496d82b1af75d0ddc102327438029a89&scene=21#wechat_redirect

相關文章
相關標籤/搜索