1.爲何須要NIO?java
Socket:當調用某個調用的時候,調用的地方就會阻塞,等待響應。這種方式對於小規模的程序很是方便,可是對於大型的程序就有點力不從心了,當有大量的鏈接的時候,咱們能夠爲每個鏈接創建一個線程來操做。可是這種作法帶來的缺陷也是顯而易見的:編程
硬件可以支持大量的併發。緩存
併發的數量始終有一個上限。網絡
各個線程之間的優先級很差控制。併發
各個Client之間的交互與同步困難。性能
咱們也可使用一個線程來處理全部的請求,使用不阻塞的IO,輪詢查詢全部的Client。這種作法一樣也有缺陷:沒法迅速響應Client端,同時會消耗大量輪詢查詢的時間。線程
因此,咱們須要一種poll(輪詢)的模式來處理這種狀況,從大量的網絡鏈接中找出來真正須要服務的Client。這正是NIO誕生的緣由:提供一種Poll的模式,在全部的Client中找到須要服務的Client。對象
NIO庫中最最重要的Class:java.nio.channels中Selector和Channel,以及java.nio中的Buffer。同步
Channel表明一個能夠被用於Poll操做的對象(能夠是文件流也可使網絡流),Channel可以被註冊到一個Selector中。經過調用Selector的select方法能夠從全部的Channel中找到須要服務的實例(Accept,read ..)。Buffer對象提供讀寫數據的緩存。相對於咱們熟悉的Stream對象,Buffer提供更好的性能以及更好的編程透明性(人爲控制緩存的大小以及具體的操做)。io