1. 程式人生 > >JAVA NIO 同步與非同步區別

JAVA NIO 同步與非同步區別

什麼是非阻塞?(為什麼我沒有說什麼是IO,既然你都學到NIO,,,要是不知道什麼是IO的話我也沒辦法咯..)

這篇文章也是簡單介紹NIO,想要看各類原始碼的同學可以繞道了- -

1 ) 非同步非阻塞例子:(網上看到的比較短小精悍的好例子,直接拿過來了)

老張愛喝茶,廢話不說,煮開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

1 老張把水壺放到火上,原地不動等水開。(同步阻塞)

 ---------->老張覺得自己有點傻

2 老張把水壺放到火上,去客廳看毛騙,時不時去看看水開沒有。(同步非阻塞)

 ---------->老張覺得自己有點傻

於是變高端了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀

~~~~的響聲。

3 老張把響水壺放到火上,立等水開。(非同步阻塞)

 --------->老張覺得自己有點傻

4 老張把響水壺放到火上,去客廳看毛騙,水壺響之前不再去看它,響了再去拿壺。(非同步非阻塞)

---------->,老張覺得自己棒棒噠

2 ) 小結:簡單講,Java NIO的非阻塞模式就是,使一個執行緒從某通道傳送請求讀取(或者寫入)資料,(如燒水)

他不是保持執行緒阻塞,所以在讀取(或者寫入)資料前,該執行緒可以繼續做其他的事情。       (例如客廳看毛騙)

3 )  IO VS NIO 的比較  (不同之處)

1.IO只能實現阻塞式的網路通訊。NIO能夠實現非阻塞的網路通訊

.(廢話)

2.標準IO基於位元組/字元流進行操作;而NIO是基於通道(Channel)進行操作的。(話說,通往女人心靈的通道是xxx...)

3.流的讀寫通常是單向的,要麼輸入,要麼輸出,不能既是輸入流又是輸出流。通道是雙向的,既可以寫資料到通道,又可以從通道中讀取資料;

4 ) 學習目標 : 雖然現在我們不會直接編寫NIO來完成我們的網路層通訊,而是使用成熟的基於NIO的網路框架來實現我們的網路層。如,nettymina。但對NIO網路程式設計過程的瞭解,非常有助於我們更深入的理解nettymina等網路框架,以至於能更好的使用它們。有人問了,不學這個對我敲程式碼有何影響,可以說,毛影響都沒

.

5 ) 知道什麼是NIO,我們再來看看java NIO的三個重要組成部分:

Channel(通道),Buffer(緩衝區),Selector(選擇器)。

當然,類比學習是比較好的學習方法,這裡我仍然跟傳統IO做比較,希望他不要打我

6 ) Channel ( 通道 ),顧名思義,就是通向什麼的道路,為某個提供了渠道。

1.傳統IO中,Stream是單向的,比如InputStream只能進行讀取操作,OutputStream只能進行寫操作。

Channel是雙向的,既可用來進行讀操作,又可用來進行寫操作。

2.具體的常見實現通道有FileChannel,SocketChanel,ServerSocketChannel,DatagramChannel

跟具體的實現流FileInputStream,FileOutputStream,FileReader,FileWriter,節點流包裝流緩衝流等等功能類似

7 ) Buffer(緩衝區),是NIO中非常重要的一個東西,實際上就是一個容器,是一個連續陣列。在NIO中所有資料的讀和寫都離不開Buffer。在NIO中,讀取的資料只能放在Buffer中。同樣地,寫入資料也是先寫入到Buffer中。

上面的圖描述了從一個客戶端向服務端傳送資料,然後服務端接收資料的過程。

簡單的講就是,要想使用Channel(通道)傳遞資料,必須先把資料丟進Buffer(緩衝區,容器).

NIO中,Buffer是一個頂層父類,它是一個抽象類,常用的Buffer的子類有:

ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer

8 ) Selector  , 可以說它是NIO中最關鍵的一個部分,Selector的作用就是用來輪詢每個註冊的Channel,一旦發現Channel有註冊的事件發生,便獲取事件然後進行處理。

以前傳統socket程式設計時,accept方法會一直阻塞,直到有客戶端請求的到來,並返回socket進行相應的處理。整個過程是就像上面的例子那樣,直到水壺燒開了(響應回去了)才能去處理下一個請求.當然我們也可以用執行緒池的模式.

NIO則為我們提供了更好的解決方案,Selector選擇器能夠檢測多個註冊的通道上是否有事件發生,如果有事件發生,便獲取事件然後針對每個事件進行相應的響應處理。這樣一來,只是用一個單執行緒就可以管理多個通道,也就是管理多個連線。這樣使得只有在連線真正有讀寫事件發生時,才會呼叫函式來進行讀寫,就大大地減少了系統開銷,並且不必為每個連線都建立一個執行緒,不用去維護多個執行緒,並且避免了多執行緒之間的上下文切換導致的開銷。並且是按順序處理,基於通道(Channel)和緩衝區(Buffer)來傳輸和儲存資料。

Selector有關的一個關鍵類是SelectionKey,一個SelectionKey表示一個到達的事件,這2個類構成了服務端處理業務的關鍵邏輯。

來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。