在網絡編程中,接觸到最多的就是利用Socket進行網絡通信開發。在Java中主要是以下三種實現方式BIO、NIO、AIO。
關于這三個概念的辨析以前一直都是好像懂,但是表達的不是很清楚,下面做個總結完全辨析清楚。
1. BIO方式
首先我用一個較為通俗的語言來說明:
BIO 就是阻塞IO,每個TCP連接進來服務端都需要創建一個線程來建立連接并進行消息的處理。如果中間發生了阻塞(比如建立連接、讀數據、寫數據時發生阻礙),線程也會發生阻塞,并發情況下,N個連接需要N個線程來處理。
這種方式的缺點就是:并發情況下效率很低。
下面用一個圖示來說明BIO的工作情況
2. NIO方式
NIO是JDK1.4提出的,還是先用一段通俗的話來說明NIO的工作原理:
NIO 也就是非阻塞IO,是基于事件驅動的思想(Reactor線程模型)。對比與BIO來說,NIO使用一個線程來管理所有的Socket 通道,也就是基于Selector機制,當查詢到事件時(連接、接受連接、讀、寫),就會轉發給不同的處理線程(handler)。
下面給出Reactor模型的工作應用圖:
3. AIO方式
AIO是JDK1.7提出的,也就是異步IO。AIO采用的是Proactor模式。我們首先應該辨析的是AIO和NIO的區別:
(1)NIO的通知是發生在Handler之前;
(2)AIO的通知是發生在讀寫等處理之后的回調,有通知時表示相關操作已經結束了。
AIO在進行讀寫操作時,只需要調用相應的read/write方法,并傳入CompletionHandler(動作完成時處理器),在動作完成后會調用CompletionHandler。 NIO的通知是發生在動作之前,是在可讀可寫的時候,Selector發現了這些事件后就通知并調用Handler處理,
下面給出Proactor模式的工作流程圖:
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/u010853261/article/details/57409540