java NIO和阻塞IO的區(qū)別
阻塞IO在調(diào)用InputStream.read()方法時時阻塞的纵装,它會一直等到數(shù)據(jù)到來時(或
超時)才會返回诬辈;同樣撞叨,在調(diào)用ServerSocket.accetp()方法時,也會一直阻塞到有客戶端
連接才會返回铛碑,每個客戶端連接過來后马昨,服務端都會啟動一個線程取處理客戶端的請求竞帽。
IO的缺點
1.當客戶端多時,會創(chuàng)建大量的處理線程鸿捧,且每個線程都要占用椧俾ǎ空間和一些cpu時間
阻塞可能帶來頻繁的上下文切換,且大部分上下文切換可能是無意義的
javaNIO原理及通信模型
1.由一個專門的線程來處理所有的IO事件匙奴,并負責分發(fā)堆巧。
2.事件驅(qū)動機制:事件到的時候觸發(fā),而不是同步的取監(jiān)視事件
3.線程通訊:線程之間通過wait泼菌,notify等方式通訊谍肤。保證每次上下文切換都是有意義的。
減少無謂的線程切換哗伯。
javaNIO的服務端只需啟動一個專門的線程來處理所有的IO事件荒揣。JavaNIO采用了
雙向通道驚醒數(shù)據(jù)傳輸,而不是單向的流
服務端和客戶端各自維護一個管理通道的對象焊刹,我們稱之為selector乳附,該對象
檢測多個通道上的事件。我們以服務端為例伴澄,如果服務端的selector上注冊了讀事件,某
時刻客戶端給服務端發(fā)送了一些數(shù)據(jù)阱缓,阻塞IO這時會調(diào)用read()方法阻塞地讀取數(shù)據(jù)非凌,而
NIO的服務端會在selector中添加一個讀事件,服務端的處理線程會輪詢地訪問
selector荆针,如果訪問selector時發(fā)現(xiàn)有感興趣的事件到達敞嗡,則處理這些事件颁糟,如果沒有感興趣的
使勁按到達,則處理線程會一直阻塞到感興趣的事件到達為止喉悴。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?