NIO非阻塞程式設計的簡單介紹

2021-08-21 19:55:56 字數 1754 閱讀 5561

因為普通的socket通訊存在著i/o問題----阻塞通訊,並且分析傳統的解決方法----執行緒池的優缺點,進而引進nio的解決方案。

1基於socket通訊的存在的問題----i/o阻塞通訊

方框內的操作會迴圈執行,並且監聽連線、讀取資料、寫入資料這些操作都是阻塞的。在其serversocket操作的具體如下:

1 socket socket = ss.accept();     //這裡是阻塞的

2  bufferreader br  = new bufferreader(new inputstramereader(socket.getinputstream()));

printwriter pw = new printwriter(socket.getoutputstream());

//讀寫資料

string line;

while(line==br.readline()!=null){          //讀阻塞

os.println(line);                               //寫阻塞

os.flush();

在jdk1.4之前解決這個問題是利用執行緒池的方法來解決的,伺服器啟動的時候建立乙個執行緒池,當監聽到客戶端連線時,就為客戶端從執行緒池取出乙個執行緒,當客戶端斷開連線時,該客戶端就會將該執行緒歸還到執行緒池中,以提高執行緒池的使用效率。

雖然執行緒池可以使伺服器處理多個連線,但是每個執行緒擁有自己的棧空間並且浪費大量的cpu時間,消耗比較大,而且很多時間是浪費在阻塞的i/o操作上,沒有有效的利用cpu。

所以最新解決方式是----nio 非阻塞通訊

首先需要理解nio的四個核心框架

1 快取buffer:它是包含資料且用於讀寫的線性表結構。其中還提供了乙個特殊的類用於記憶體對映檔案的i/o操作。

2 字符集charset:提供了unicode字串影射到位元組序列及逆影射的操作。

3 通道channel:包含socket、file和pipe這三個管道,它實際上是雙向交流的通道。

4 選擇器selector:將多元非同步i/o操作集中到乙個或多個執行緒中。

(下次會詳細的解釋這四種核心框架)

然後了解一下nio通道程式設計:簡單了解一下四種通道類程式設計(具體下次詳細介紹)

1 檔案通道filechannel:用於實現對檔案的讀取、寫入、鎖定和對映

2 socket通道socketchannel:實現基於socket通道

3 serversocket通道serversocket:實現基於serversocket通道

4 資料報信道datagramchannel:實現基於datagramchannel通道

nio的非阻塞i/o機制是圍繞選擇器和通道構建的。channel類表示伺服器和客戶端之間的一種通訊機制。與反應器模式一致。selector類是channel的多路復用器。selector類將傳入客戶機請求的多路分用。並且將他們分派到各自的請求處理程式,實現客戶端請求事件的非阻塞監聽

在橢圓區域中,selector***負責輪詢客戶端的連線、讀取和寫入事件,這些事件執行都不會被阻塞,並且提高執行效率,nio讀取和寫入事件都使用了快取區。

阻塞IO與非阻塞NIO

通常的,對乙個檔案描述符指定的檔案或裝置,有兩種工作方式 阻塞 與非阻塞 所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待 狀態,直到有東西可讀或者可寫為止。而對於非阻塞狀態,如果沒有東西可讀,或者不可寫,讀寫函式馬上返回,而不會等待 一種...

NIO同步阻塞與同步非阻塞

io與nio區別 其本質就是阻塞和非阻塞的區別。阻塞概念 應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,就會一直等待,直到傳輸完畢為止。非阻塞概念 應用程式直接可以獲取已經準備就緒好的資料,無需等待。io為同步阻塞形式,nio為同步非阻塞形式,nio並沒有實現非同步,在jdk1.7公升級nio...

NIO基礎之同步 非同步 阻塞 非阻塞

這裡區分幾個概念,也是常見但是容易混淆的概念,就是標題中的同步 非同步 阻塞 非阻塞。同步與非同步,關心的是訊息通訊的機制。也就是呼叫者和被呼叫者之間,訊息是如何進行通知的。如果是呼叫者主動等待呼叫的結果,那麼就是同步。如果是被呼叫者主動去通知呼叫者,就是非同步。從上面的描述中,我們可以看到。同步還...