關於JAVA "NIO" 相關資料網上太多,如果你在網上一搜結果裏一般就會說什麼bio是一個線程處理一個tcp連接,什麼調用read就阻塞直到有內容,而nio是通過單線程輪詢方式,不會產生線程阻塞;然後就貼出一堆關於Socket ServerSocket,SocketChannel ServerSocketChannel的代碼,讓人感到疑惑到底什麼是NIO
其實看到這些概念我是懵逼(上面說的都沒有錯,只不過這些都不是我想要了解的層次)
在最開始我沒有明白NIO到底是JAVA獨有的東西還是其他語言普遍存在的一個概念?它到底是操作系統支持的?還是通過api設計而達到的某種特性?
它到底是一個什麼東西?
通過
https://blog.csdn.net/qq_34638435/article/details/81878301
https://www.cnblogs.com/binarylei/p/8933516.html#同步非阻塞-io-nonblocking-io
解開了我部分疑惑;NIO是一種網絡IO模型,Linux中提出來的(windows中是否實現?如何實現?)
自然而然一上來就是各種socket代碼了(JAVA中也提供了文件相關的Channel)。
Java裏的NIO是New Input/Output的簡稱,提供了各種輸入輸出相關的api,包括文件IO、網絡IO(多路複用IO模型的實現:ServerSocketChannel相關api,AIO模型的實現:AsynchronousSocketChannel相關api)等;
以下是我對同步 異步,阻塞 非阻塞的理解
同步:調用內核api後線程主動阻塞,直到內核api返回結果
異步:調用內核api後線程不阻塞,可繼續做其他事情
阻塞:內核接收到調用後,依次完成
1、從網絡中獲取到數據
2、將數據從內核內存拷貝到應用內存過程後返回返回值
非阻塞:內核收到調用後,根據實際情況返回返回值(有數據就返回數據,沒有數據也返回一個標記)
通過下面這張圖可以比較清晰的看出JAVA api和操作系統(以linux爲例)是如何配合來實現多路複用IO的
(JAVA端:客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理)
附:網絡IO模型比較
over