天天看點

NIO的基本講解

NIO:全稱java non-blocking IO(實際上是 new io),是指jdk1.4 及以上版本裡提供的新api(New IO) ,為所有的原始類型(boolean類型除外)提供緩存支援的資料容器,使用它可以提供非阻塞式的高伸縮性網絡

Java NIO和IO的主要差別:

IO NIO

面向流 面向Buffer(緩沖區)

阻塞IO 非阻塞IO

Selectors

最重要的3個概念,

Channel 通道

Buffer 緩沖區

Selector 選擇器

其中Channel對應以前的流,Buffer不是什麼新東西,Selector是因為nio可以使用異步的非堵塞模式才加入的東西。

以前的流總是堵塞的,一個線程隻要對它進行操作,其它操作就會被堵塞,也就相當于水管沒有閥門,你伸手接水的時候,不管水到了沒有,你就都隻能耗在接水(流)上。

nio的Channel的加入,相當于增加了水龍頭(有閥門),雖然一個時刻也隻能接一個水管的水,但依賴輪換政策,在水量不大的時候,各個水管裡流出來的水,都可以得到妥善接納,這個關鍵之處就是增加了一個接水工,也就是Selector,他負責協調,也就是看哪根水管有水了的話,在目前水管的水接到一定程度的時候,就切換一下:臨時關上目前水龍頭,試着打開另一個水龍頭(看看有沒有水)。

當其他人需要用水的時候,不是直接去接水,而是事前提了一個水桶給接水工,這個水桶就是Buffer。也就是,其他人雖然也可能要等,但不會在現場等,而是回家等,可以做其它事去,水接滿了,接水工會通知他們。

這其實也是非常接近目前社會分工細化的現實,也是統分利用現有資源達到并發效果的一種很經濟的手段,而不是動不動就來個并行處理,雖然那樣是最簡單的,但也是最浪費資源的方式。