BIO/NIO/AIO/NETTYhtml
摘自:芋道源碼 :精盡 Netty編程
同步/異步:針對的被調用者的狀態。也就是fun函數。(也就是上面的燒水壺)數組
同步是指fun若是沒有結果就不會返回,除非有結果了。
異步是指fun在被調用以後就當即返回了。返回結果以後再通知調用者(能夠用信號、回調之類的實現)。
服務器
阻塞/非阻塞:主要是針對調用者的,是指程序在等待結果時的狀態。(也就是上面的老張在等水開時的狀態)阻塞是指調用線程會被掛起,不作什麼別的事情。在獲得結果以後纔會返回。
摘自:阻塞非阻塞和同步異步的區別網絡
原理併發
小結異步
BIO 模型中,經過 Socket 和 ServerSocket 實現套接字通道的通訊。阻塞,同步,創建鏈接耗時。函數
原理oop
NIO 相對於 BIO 來講一大進步。客戶端和服務器之間經過 Channel 通訊。NIO 能夠在 Channel 進行讀寫操做。這些 Channel 都會被註冊在 Selector 多路複用器上。Selector 經過一個線程不停的輪詢這些 Channel 。找出已經準備就緒的 Channel 執行 IO 操做。NIO 經過一個線程輪詢,實現千萬個客戶端的請求,這就是非阻塞 NIO 的特色。spa
BIO 是將數據直接寫入或讀取到流 Stream 對象中。
NIO 的數據操做都是在 Buffer 中進行的。Buffer 其實是一個數組。Buffer 最多見的類型是ByteBuffer,另外還有 CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
通道分爲兩大類:一類是網絡讀寫(SelectableChannel),一類是用於文件操做(FileChannel)。咱們使用的是前者 SocketChannel 和 ServerSocketChannel ,都是SelectableChannel 的子類。
服務器端只要提供一個線程負責 Selector 的輪詢,就能夠接入成千上萬個客戶端,這就是 JDK NIO 庫的巨大進步。
小結
NIO 模型中經過 SocketChannel 和 ServerSocketChannel 實現套接字通道的通訊。非阻塞,同步,避免爲每一個 TCP 鏈接建立一個線程。
原理
小結
AIO 模型中經過 AsynchronousSocketChannel 和 AsynchronousServerSocketChannel 實現套接字通道的通訊。非阻塞,異步。
理解 BIO、NIO、AIO 的流程,能夠在理解下圖: