導航:首頁 > 編程語言 > javanio內存

javanio內存

發布時間:2024-05-08 05:47:23

java Nio讀寫為什麼是雙向

作者:美團技術團隊
鏈接:https://zhuanlan.hu.com/p/23488863
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

NIO(Non-blocking I/O,在Java領域,也稱為New I/O),是一種同步非阻塞的I/O模型,也是I/O多路復用的基礎,已經被越來越多地應用到大型應用伺服器,成為解決高並發與大量連接、I/O處理問題的有效方式。

那麼NIO的本質是什麼樣的呢?它是怎樣與事件模型結合來解放線程、提高系統吞吐的呢?

本文會從傳統的阻塞I/O和線程池模型面臨的問題講起,然後對比幾種常見I/O模型,一步步分析NIO怎麼利用事件模型處理I/O,解決線程池瓶頸處理海量連接,包括利用面向事件的方式編寫服務端/客戶端程序。最後延展到一些高級主題,如Reactor與Proactor模型的對比、Selector的喚醒、Buffer的選擇等。

註:本文的代碼都是偽代碼,主要是為了示意,不可用於生產環境。

傳統BIO模型分析

讓我們先回憶一下傳統的伺服器端同步阻塞I/O處理(也就是BIO,Blocking I/O)的經典編程模型:

{
ExecutorService executor = Excutors.newFixedThreadPollExecutor(100);//線程池

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(8088);
while(!Thread.currentThread.isInturrupted()){//主線程死循環等待新連接到來
Socket socket = serverSocket.accept();
executor.submit(new ConnectIOnHandler(socket));//為新的連接創建新的線程
}

class ConnectIOnHandler extends Thread{
private Socket socket;
public ConnectIOnHandler(Socket socket){
this.socket = socket;
}
public void run(){
while(!Thread.currentThread.isInturrupted()&&!socket.isClosed()){死循環處理讀寫事件
String someThing = socket.read()....//讀取數據
if(someThing!=null){
......//處理數據
socket.write()....//寫數據
}

}
}
}

這是一個經典的每連接每線程的模型,之所以使用多線程,主要原因在於socket.accept()、socket.read()、socket.write()三個主要函數都是同步阻塞的,當一個連接在處理I/O的時候,系統是阻塞的,如果是單線程的話必然就掛死在那裡;但CPU是被釋放出來的,開啟多線程,就可以讓CPU去處理更多的事情。其實這也是所有使用多線程的本質:

閱讀全文

與javanio內存相關的資料

熱點內容
無錫人怎麼在APP里 瀏覽:810
安卓系統怎麼讓應用不保存緩存 瀏覽:482
高性能web站點pdf 瀏覽:980
scratch飛機大戰編程全程教學 瀏覽:2
java網路編程詳解 瀏覽:694
oppo手機如果應用加密了如何解開 瀏覽:898
q退出命令 瀏覽:758
java變數單例 瀏覽:482
javametainf 瀏覽:967
sys編譯軟體 瀏覽:640
學數控編程准備 瀏覽:156
可愛的程序員西米沒了 瀏覽:295
葉羅麗冰公主解壓本 瀏覽:981
車用空調壓縮機品牌 瀏覽:830
在回收站中可以恢復幾個文件夾 瀏覽:916
phpget轉義 瀏覽:322
我的世界寶可夢伺服器叫什麼名字 瀏覽:748
新聞編譯難嗎 瀏覽:582
ia架構伺服器是什麼意思 瀏覽:220
linux查看區域網 瀏覽:77