在Java中提供了三種IO模型:BIO、NIO、AIO,模型的選擇決定了程序通訊的性能。java
BIO適用於鏈接數比較小的應用,這種IO模型對服務器資源要求比較高。服務器
NIO適用於鏈接數目多、鏈接時間短的應用,好比聊天、彈幕、服務器間通信等應用。多線程
AIO適用於鏈接數目多、鏈接時間長的應用,好比相冊服務器。併發
同步並阻塞模型,服務器會爲每個鏈接創建一個線程,若是鏈接過多,且線程不作任何事情,會極大的浪費資源,示意圖以下:
異步
流程:性能
同步非阻塞模型,服務器端用一個線程處理多個鏈接,客戶端發送的鏈接請求會註冊到多路複用器上,多路複用器輪詢到鏈接有IO請求就進行處理:
spa
NIO的非阻塞模式,使得一個線程從某通道發送請求或者讀取數據時,若是目前沒有可用的數據,不會使線程阻塞,在數據可讀以前,該線程能夠作其餘的事情。操作系統
NIO有三大核心部分:線程
由圖可知:code
本質是能夠讀寫數據的內存塊,Channel讀取或者寫入的數據必須經過Buffer:
java.nio.Buffer抽象類的屬性:
// Invariants: mark <= position <= limit <= capacity private int mark = -1; private int position = 0; private int limit; private int capacity;
通道是雙向的,能夠讀操做、也能夠寫操做。
java.nio.channels.Channel接口的經常使用實現類:
FileChannel用於文件的數據讀寫,DatagramChannel用於UDP的數據讀寫,ServerSocketChannel和SocketChannel用於TCP的數據讀寫。
Selector選擇器使用一個線程來維護。多個Channel會以事件的方式註冊到同一個Selector,當有事件發生時,Selector會獲取事件,而後針對每一個事件進行響應的處理。這樣就沒必要爲每一個鏈接建立一個線程,不用維護多線程,也不會有多線程之間的上下文切換致使的系統的開銷。
Selector示意圖:
異步非阻塞模型,AIO引入異步通道的概念,使用了Proactor,只有有效的請求才啓動線程,特色是先由操做系統完成後,才通知服務器端程序啓動線程去處理,通常適用於鏈接數較多且鏈接時間較長的應用。