java nio 高並發服務器


傳統java網絡編程中,服務端創建serversocket,為每個客戶端單獨創建一個線程thread,分別處理請求。對cpu來說,線程開銷很大,無限創建線程讓操作系統崩潰。

在系統啟動時創建一個動態的線程池。但是在高並發情況下不太樂觀。當線程池大小超過cpu瓶頸時,就極其地下了。

在jdk4后,引入nio,即非阻塞IO。無需多個線程,僅僅一個線程,即可處理全部客戶端,解決了性能和並發的兩個問題。

NIO采用通道(channel)和選擇器(Selector)的核心對象,select機制。不為每個客戶端連接新啟線程處理,而是將其注冊到selector對象上。可在單線程利用selector對象管理

大量並發連接。不要求阻塞等待IO操作即可返回,減少管理io連接導致的系統開銷。

當有讀或寫等任何注冊的事件發生時,可從selector中獲得selectionKey,從selectionKey中可以找到發生的事件和該事件所發生的具體的SelectableChannel,已獲得客戶端發送來的數據。

采用事件觸發機制,處理程序可以得到系統的主動通知,從而可以得到底層網絡IO無阻色的讀寫。不像以前循環等待。使用NIO,可以編寫性能更好,更易擴展的並發性服務器程序。

 

設計原理(觀察者模式)

有selector輪詢各個Socketchannel通道是否有事件發生,有則選擇出所有的key集合。然后傳遞給處理程序。通過每個key,就可以獲取客戶端的SocketChannel,從而進行通信。

如果Selector發現所以通道都沒有事件發生,則進入睡眠狀態,阻塞,等待客戶端有事件發生。會自動喚醒wakeup選擇器selector。

 

java NIO具有網絡跨時代的意義,Mina就是采用nio機制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM