1. netty 和 java nio 的區別
Java NIO框架MINA用netty性能和鏈接數、並發等壓力測試參數好於mina。
NIO彌補了原來的I/O的不足,它再標准java代碼中提供了高速和面向塊的I/O
原力的I/O庫與NIO最重要的區別是數據打包和傳輸方式的不同,原來的I/O以流的方式處理數據,而NIO以塊的方式處理數據;
NIO以通道channel和緩沖區Buffer為基礎來實現面向塊的IO數據處理,MINA是開源的。
JavaNIO非堵塞應用通常適用用在I/O讀寫等方面,我們知道,系統運行的性能瓶頸通常在I/O讀寫,包括對埠和文件的操作上,過去,在打開一個I/O通道後,read()將一直等待在埠一邊讀取位元組內容,如果沒有內容進來,read()也是傻傻的等,這會影響我們程序繼續做其他事情,那麼改進做法就是開設線程,讓線程去等待,但是這樣做也是相當耗費資源的。
Java NIO非堵塞技術實際是採取Reactor模式,或者說是Observer模式為我們監察I/O埠,如果有內容進來,會自動通知我們,這樣,我們就不必開啟多個線程死等,從外界看,實現了流暢的I/O讀寫,不堵塞了。
Java NIO出現不只是一個技術性能的提高,會發現網路上到處在介紹它,因為它具有里程碑意義,從JDK1.4開始,Java開始提高性能相關的功能,從而使得Java在底層或者並行分布式計算等操作上已經可以和C或Perl等語言並駕齊驅。
如果至今還是在懷疑Java的性能,說明思想和觀念已經完全落伍了,Java一兩年就應該用新的名詞來定義。從JDK1.5開始又要提供關於線程、並發等新性能的支持,Java應用在游戲等適時領域方面的機會已經成熟,Java在穩定自己中間件地位後,開始蠶食傳統C的領域。
原理:
NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知socketchannel告訴Selector,我們接著做別的事情,當有事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛注冊過的socketchannel,然後,我們從這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。Selector內部原理實際是在做一個對所注冊的channel的輪詢訪問,不斷的輪詢(目前就這一個演算法),一旦輪詢到一個channel有所注冊的事情發生。比如數據來了,他就會站起來報告,交出一把鑰匙,讓我們通過這把鑰匙來讀取這個channel的內容。在使用上,也在分兩個方向,一個是線程處理,一個是用非線程,後者比較簡單。
2. Java NIO與IO的區別和比較
nio是new io的簡稱,從jdk1.4就被引入了,可以說不是什麼新東西了。nio的主要作用就是用來解決速度差異的。舉個例子:計算機處理的速度,和用戶按鍵盤的速度。這兩者的速度相差懸殊。
如果按照經典的方法:一個用戶設定一個線程,專門等待用戶的輸入,無形中就造成了嚴重的資源浪費:每一個線程都需要珍貴的cpu時間片,由於速度差異造成了在這個交互線程中的cpu都用來等待。 在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。
3. java nio好像在項目中很少被人使用為什麼呢
因為有了Netty啊,nio有很多問題,nio2隻能在1.7下用,並且問題並不比原來少
所以說,jdk的更新有時候會殺掉一批開源項目,有時候會被開源項目打臉。
4. Java.nio 和 Java.io有什麼區別
nio是new io的簡稱,從jdk1.4就被引入了。其中的一些思想值得我來研究。
首先先分析下:為什麼要nio套接字?
nio的主要作用就是用來解決速度差異的。舉個例子:計算機處理的速度,和用戶按鍵盤的速度。這兩者的速度相差懸殊。如果按照經典的方法:一個用戶設定一個線程,專門等待用戶的輸入,無形中就造成了嚴重的資源浪費:每一個線程都需要珍貴的cpu時間片,由於速度差異造成了在這個交互線程中的cpu都用來等待。
nio套接字是怎麼做到的?
其實,其中的思想很簡單:輪詢。一個線程輪詢多個input;傳統的方式是:有n個客戶端就要有n個服務線程+一個監聽線程,現在採取這種凡是,可以僅僅使用1個線程來代替n個服務線程以此來解決。
具體應用例子:
在ftp的控制連接中,因為只有少量的字元命令進行傳輸,所以可以考慮利用這種輪詢的方式實現,以節省資源。
-----------------------------------------------------
Java中的阻塞和非阻塞IO包各自的優劣思考
NIO 設計背後的基石:反應器模式,用於事件多路分離和分派的體系結構模式。
反應器(Reactor):用於事件多路分離和分派的體系結構模式
通常的,對一個文件描述符指定的文件或設備, 有兩種工作方式: 阻塞 與非阻塞 。所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 如果當時沒有東西可讀,或者暫時不可寫, 程序就進入等待 狀態, 直到有東西可讀或者可寫為止。而對於非阻塞狀態, 如果沒有東西可讀, 或者不可寫, 讀寫函數馬上返回, 而不會等待 。
一種常用做法是:每建立一個Socket連接時,同時創建一個新線程對該Socket進行單獨通信(採用阻塞的方式通信)。這種方式具有很高的響應速度,並且控制起來也很簡單,在連接數較少的時候非常有效,但是如果對每一個連接都產生一個線程的無疑是對系統資源的一種浪費,如果連接數較多將會出現資源不足的情況。
另一種較高效的做法是:伺服器端保存一個Socket連接列表,然後對這個列表進行輪詢,如果發現某個Socket埠上有數據可讀時(讀就緒),則調用該socket連接的相應讀操作;如果發現某個 Socket埠上有數據可寫時(寫就緒),則調用該socket連接的相應寫操作;如果某個埠的Socket連接已經中斷,則調用相應的析構方法關閉該埠。這樣能充分利用伺服器資源,效率得到了很大提高。
傳統的阻塞式IO,每個連接必須要開一個線程來處理,並且沒處理完線程不能退出。
非阻塞式IO,由於基於反應器模式,用於事件多路分離和分派的體系結構模式,所以可以利用線程池來處理。事件來了就處理,處理完了就把線程歸還。而傳統阻塞方式不能使用線程池來處理,假設當前有10000個連接,非阻塞方式可能用1000個線程的線程池就搞定了,而傳統阻塞方式就需要開10000個來處理。如果連接數較多將會出現資源不足的情況。非阻塞的核心優勢就在這里。
為什麼會這樣,下面就對他們做進一步細致具體的分析:
首先,我們來分析傳統阻塞式IO的瓶頸在哪裡。在連接數不多的情況下,傳統IO編寫容易方便使用。但是隨著連接數的增多,問題傳統IO就不行了。因為前面說過,傳統IO處理每個連接都要消耗 一個線程,而程序的效率當線程數不多時是隨著線程數的增加而增加,但是到一定的數量之後,是隨著線程數的增加而減少。這里我們得出結論,傳統阻塞式IO的瓶頸在於不能處理過多的連接。
然後,非阻塞式IO的出現的目的就是為了解決這個瓶頸。而非阻塞式IO是怎麼實現的呢?非阻塞IO處理連接的線程數和連接數沒有聯系,也就是說處理10000個連接非阻塞IO不需要10000個線程,你可以用1000個也可以用2000個線程來處理。因為非阻塞IO處理連接是非同步的。當某個連接發送請求到伺服器,伺服器把這個連接請求當作一個請求"事件",並把這個"事件"分配給相應的函數處理。我們可以把這個處理函數放到線程中去執行,執行完就把線程歸還。這樣一個線程就可以非同步的處理多個事件。而阻塞式IO的線程的大部分時間都浪費在等待請求上了。
5. Java NIO和IO的區別
Java
NIO和IO的主要區別如下:
1.NIO
的創建目的是為了讓
Java
程序員可以實現高速
I/O
而無需編寫自定義的本機代碼。NIO
將最耗時的
I/O
操作(即填充和提取緩沖區)轉移回操作系統,因而可以極大地提高速度。傳統的IO操作屬於阻塞型,嚴重影響程序的運行速度。
2,。流與塊的比較。原來的
I/O
庫(在
java.io.*中)
與
NIO
最重要的區別是數據打包和傳輸的方式。正如前面提到的,原來的
I/O
以流的方式處理數據,而
NIO
以塊的方式處理數據。
面向流
的
I/O
系統一次一個位元組地處理數據。一個輸入流產生一個位元組的數據,一個輸出流消費一個位元組的數據。為流式數據創建過濾器非常容易。鏈接幾個過濾器,以便每個過濾器只負責單個復雜處理機制的一部分,這樣也是相對簡單的。不利的一面是,面向流的
I/O
通常相當慢。
3.一個
面向塊
的
I/O
系統以塊的形式處理數據。每一個操作都在一步中產生或者消費一個數據塊。按塊處理數據比按(流式的)位元組處理數據要快得多。但是面向塊的
I/O
缺少一些面向流的
I/O
所具有的優雅性和簡單性。
6. java裡面的NIO是什麼,有什麼用
NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。
在Java API中提供了兩套NIO,一套是針對標准輸入輸出NIO,另一套就是網路編程NIO。
7. Java中nio與普通io有什麼優勢
1,nio的主要作用就是用來解決速度差異的。舉個例子:計算機處理的速度,和用戶按鍵盤的速度,這兩者的速度相差懸殊。
2,如果按照經典的方法:一個用戶設定一個線程,專門等待用戶的輸入,無形中就造成了嚴重的資源浪費,每一個線程都需要珍貴的cpu時間片,由於速度差異造成了在這個交互線程中的cpu都用來等待。
3,傳統的阻塞式IO,每個連接必須要開一個線程來處理,並且沒處理完線程不能退出。
4,非阻塞式IO,由於基於反應器模式,用於事件多路分離和分派的體系結構模式,所以可以利用線程池來處理。事件來了就處理,處理完了就把線程歸還。
5,而傳統阻塞方式不能使用線程池來處理,假設當前有10000個連接,非阻塞方式可能用1000個線程的線程池就搞定了,而傳統阻塞方式就需要開10000個來處理。如果連接數較多將會出現資源不足的情況。非阻塞的核心優勢就在這里。
8. java的nio
這個其實從所謂的七層結構來說吧。java是不能操作到數據鏈路層和物理層的,所以它只能是通過jvm和第三方工具來實現。所以java是不能用到系統的IO資源的。
9. 什麼是Java NIO,它的工作原理是什麼
Java NIO是在jdk1.4開始使用的,它既可以說成「新I/O」,也可以說成非阻塞式I/O。
1. 由一個專門的線程來處理所有的 IO 事件,並負責分發。
2. 事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。
3. 線程通訊:線程之間通過 wait,notify 等方式通訊。保證每次上下文切換都是有意義的。減少無謂的線程切換。