這篇文章主要介紹“Netty NIO的簡單介紹”,在日常操作中,相信很多人在Netty NIO的簡單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Netty NIO的簡單介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)公司主營伊通網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都app軟件開發(fā)公司,伊通h5微信小程序開發(fā)搭建,伊通網(wǎng)站營銷推廣歡迎伊通等地區(qū)企業(yè)咨詢
也就是傳統(tǒng)IO(也就是InputStream、OutputStream等Java中IO包下的類以及 java.net下面提供的部分網(wǎng)絡 API,比如 Socket、ServerSocket、HttpURLConnection 也歸類到同步阻塞 IO 類庫,因為網(wǎng)絡通信同樣是 IO 行為。)在進行讀寫操作(調(diào)用read/write方法)時會停止當前線程,使得當前線程進入阻塞狀態(tài),直到讀寫操作結束后,線程才能繼續(xù)執(zhí)行。
傳統(tǒng)IO的同步阻塞問題導致了其在性能上的極大缺陷,因為每一個線程在同一時刻只能管理(運行)一個IO流,尤其是對于網(wǎng)絡應用程序來說,如果采用傳統(tǒng)IO方式,那么只能一個線程管理持有一個IO流,這對于系統(tǒng)來說并發(fā)情況下的性能瓶頸就太大了,代碼如下所示
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 傳統(tǒng)socket服務端 * */ public class ioServer { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); //創(chuàng)建socket服務,監(jiān)聽10101端口 ServerSocket server=new ServerSocket(10101); System.out.println("如果使用傳統(tǒng)IO方式,那么就必須為每一個連接到服務端的客戶端建立一個線程來處理IO,并發(fā)量低的時候還好,可是一旦并發(fā)量極高,造成創(chuàng)建大量線程,就會導致非常頻繁的進行線程間切換,這對系統(tǒng)性能消耗極大,而且線程切換是無用的消耗。
同步和阻塞是有區(qū)別的,它們的修飾對象是不同的。
阻塞和非阻塞是指進程訪問的數(shù)據(jù)如果尚未就緒,進程是否需要等待,簡單說這相當于函數(shù)內(nèi)部的實現(xiàn)區(qū)別,也就是未就緒時是直接返回還是等待就緒。
同步和異步是指訪問數(shù)據(jù)的機制,同步一般指主動請求并等待I/O操作完畢的方式,當數(shù)據(jù)就緒后在讀寫的時候必須阻塞,異步則指主動請求數(shù)據(jù)后便可以繼續(xù)處理其它任務,隨后等待I/O,操作完畢的通知,這可以使進程在數(shù)據(jù)讀寫時也不阻塞。2. NIO(AIO)
異步非阻塞
為了改善傳統(tǒng)IO的問題,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的類,可以構建多路復用的、同步非阻塞IO 程序,同時提供了更接近操作系統(tǒng)底層的高性能數(shù)據(jù)操作方式。在 Java 7 中,NIO 有了進一步的改進,也就是 NIO 2,引入了異步非阻塞IO 方式,也有很多人叫它 AIO(Asynchronous IO)。異步 IO 操作基于事件和回調(diào)機制,可以簡單理解為,讀寫操作直接返回,而不會阻塞在那里,當后臺處理完成,操作系統(tǒng)會通知相應線程進行后續(xù)工作,并發(fā)性能再次提升。針對
NIO核心實現(xiàn)類
Java中為NIO提供三個核心實現(xiàn)類,主要是緩沖區(qū)(Buffer)、通道(Channel)、選擇器(Selector)。
1. 通道(Channel)
1. 通道(Channel):原本在傳統(tǒng)IO中是通過流來進行讀寫操作,但是在NIO中是采用Channel來進行讀寫操作,Channel替代了傳統(tǒng)IO中的流。
2. Java中提供了Channel的幾種具體實現(xiàn)類,這些通道涵蓋了UDP 和 TCP 網(wǎng)絡IO,以及文件IO。
FileChannel:文件IO
DatagramChannel:UDP網(wǎng)絡IO
SocketChannel:TCP客戶端網(wǎng)絡IO
ServerSocketChannel:TCP服務端網(wǎng)絡IO
3. Channel有三個特點:
Channel是可讀可寫的,但是一個Channel要么只能寫要么只能讀
Channel可以異步的讀和寫
數(shù)據(jù)總是從Channel中讀到Buffer,或者從Buffer中寫到Channel
2. 緩沖區(qū)(Buffer)
1. Channel負責讀寫數(shù)據(jù),而緩沖區(qū)Buffer則負責臨時保存Channel讀寫的數(shù)據(jù),也就是緩存數(shù)據(jù),所有的數(shù)據(jù)都會經(jīng)過Buffer寫入到Channel或者從Channel中讀取存儲到Buffer。JavaNIO中為Buffer提供了所有基本數(shù)據(jù)類型的實現(xiàn)類,覆蓋了你能通過IO發(fā)送的基本數(shù)據(jù)類型:byte, short, int, long, float, double 和 char。還有另外一個MappedByteBuffer。
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
3. 選擇器(Selector)
1. 傳統(tǒng)IO因為一個線程對應一個IO的局限導致其在高并發(fā)下的性能浪費,而NIO中則因為Selector的存在實現(xiàn)了允許一個單獨的線程來監(jiān)視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
要使用Selector,得向Selector注冊Channel,然后調(diào)用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒。一旦這個方法返回,線程就可以處理這些事件,事件的例子有如新連接進來,數(shù)據(jù)接收等。
到此,關于“Netty NIO的簡單介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文標題:NettyNIO的簡單介紹
分享地址:http://weahome.cn/article/piegji.html