3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

NIO的由來

我們都知道,在jdk1.4的時候就開始引入NIO了,它是基於Selector機制的非阻塞I/O,可以將多個異步的I/O操作集中到一個或幾個線程中進行處理,目的就是為了代替阻塞I/O,提到系統的併發吞吐量,以提升性能。

什麼場景下使用NIO

當客戶端的數據傳遞不是連續的,而是斷斷續續的,這時如果使用傳統的阻塞I/O,則程序需要等待,若此時還有多個線程,每個客戶端的請求使用一個線程進行處理,那麼操作系統還要進行上下文切換,性能上更是雪上加霜。

而此時使用NIO,則可以明顯提升系統處理效率和性能。

如何實現一個簡易的NIO

瞭解了NIO的由來和使用場景,那麼接下來就實打實的寫出來,不瞭解的同學不用擔心看不懂相關的api,筆者已將每個步驟的註釋都標明瞭,以方便大家閱讀,相信大家看完下面的代碼後就會輕鬆掌握。

首先,我們先實現一個接收請求的線程(AcceptJob.class):

3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

接著,我們實現一個處理請求的線程(ProcessJob.class):

3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

好了,核心的代碼完成了,下面接著寫一個類(NioDemo.class),用來模擬服務端:

3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

到此為止,一個簡易的NIO示例就完成了,AcceptJob負責接收不斷而來的請求,ProcessJob時刻處理著到來的請求。

最後,為了給大家演示一下效果,我們實現一個客戶端(ClientDemo.class),用來模擬發送請求,然後我們先啟動服務端(run一下NioDemo),在啟動客戶端即可:

3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

3張圖教你寫NIO,學會了再也不用怕面試,年薪漲!漲!漲!

特別注意一下,clientSelector.selectedKeys().iterator()這一句,它的目的就是對當前已經就緒的客戶端進行迭代,以便後續針對每個客戶端進行處理。

總結

從代碼就能看出,NIO的selector機制完全可以讓線程不必等待客戶端I/O的就緒(即不必阻塞),如果沒就緒,我們完全可以去幹別的事,等到就緒了,就會立即回來處理,這樣一來,性能肯定能大大提升。

溫馨提示:NIO的使用絕不僅僅是上述示例這麼簡單,例子只是為了帶領大家入門,給與在這塊完全是空白的小白們一個基本概念的理解,想用好這一塊,還需要多下點功夫。但是話說回來,雖然示例比較簡單,卻是麻雀雖小五臟俱全,希望對大家有所幫助。


分享到:


相關文章: