【原創】java-NIO(一)阻塞IO與非阻塞IO--轉載請註明出處

零、一個小故事

在講解阻塞IO與非阻塞IO之前,先舉出一個小小的例子:

       一個老闆經營一個飯店,最初的時候,每來一個客人安排一個服務員招呼,客人很滿意。

  後來客人越來越多,需要的服務員越來越多,但是餐廳的後廚已經擠滿了服務員,不能請更多的服務員了,之前的經營模式已經不能滿足需求。老闆之所以是老闆,自然有自己的過人之處,老闆發現,服務員在爲客人服務時,當客人點菜的時候,服務員基本處於等待狀態,不會做任何事情。

  於是乎就讓服務員在客人點菜的時候,去爲其他客人服務,當服務員有空閒時,每隔一段時間詢問一次客人,菜是否已經點好了,此時再對客人進行下單服務。在經歷了這種改革以後,便能在有限的服務員數量前提下,爲更多的客人提供服務了。

一、阻塞IO與非阻塞IO

在上面的飯店的故事中,每一個服務員等待客人點單,就是一個阻塞IO的例子,而在客人挑選好菜品,下單時再招呼服務員前來服務,就是非阻塞IO的例子。

下面的圖6.1中,即是阻塞IO的模型,在進行阻塞IO的操作時,應用調用系統本身的內核,來處理數據,但是此時數據是未處理完成的,也就是上面所說的等待用戶點菜,等到用戶點菜完成後,再進行下單時,應用纔會繼續執行後續操作。

在下方的圖,則是非阻塞IO的模型,在進行非阻塞IO的操作時,應用在調用系統內核來處理數據時,無論是否已經將數據準備完成,都會給予調用方一個響應信息,也就是上面所說的,服務員在有空的時候,會去詢問一下客人是否完成了點菜,如果用戶點菜完成了,則再幫助客人進行下單。

三、客人覺得總被詢問好像不太好:

雖然經歷了改革,使服務員服務到了更多的客人,但是客人覺得總是被詢問似乎不太好,而且服務員經常這樣跑來跑去也很疲倦,聰明的老闆又引進了新的方式進行了第二次改革,在每個客人的桌子上添加了一個反應器,在客人點單完成後,主動由客人來呼叫服務員前來服務。

四、反應器模式

java的NIO,非阻塞IO,在上面的模式上進行了改進,將輪詢的模式,改爲了通知的模式,在處理器完成了對數據的準備過程以後,再由處理器通知應用,來對數據進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章