java nio的io模型是同步非阻塞,這里的同步異步指的是真正io操作(資料內核態用戶態的拷貝)是否需要行程參與,
而說java nio提供了異步處理,這個異步應該是指編程模型上的異步,基于reactor模式的事件驅動,事件處理器的注冊和處理器的執行是異步的,
JAVA NIO是同步非阻塞io,同步和異步說的是訊息的通知機制,阻塞非阻塞說的是執行緒的狀態 ,
下面說說我的理解,client和服務器建立了socket連接:
1、同步阻塞io(Blocking, synchronous):client在呼叫read()方法時,stream里沒有資料可讀,執行緒停止向下執行,直至stream有資料,
-
阻塞
:體現在這個執行緒不能干別的了,只能在這里等著 -
同步
:是體現在訊息通知機制上的,即stream有沒有資料是需要我自己來判斷的,
device = IO.open()
data = device.read() # thread will be blocked until there is no data in the device
print(data)
2、同步非阻塞io(Non-blocking, synchronous)):呼叫read方法后,如果stream沒有資料,方法就回傳,然后這個執行緒就就干別的去了,
- 非阻塞:體現在,這個執行緒可以去干別的,不需要一直在這等著
- 同步:體現在訊息通知機制,這個執行緒仍然要定時的讀取stream,判斷資料有沒有準備好,client采用回圈的方式去讀取,可以看出CPU大部分被浪費了
device = IO.open()
while True:
is_ready = IO.poll(device, IO.INPUT, 5) # returns control if 5 seconds have elapsed or there is data to read (INPUT)
if is_ready:
data = device.read()
break # exit loop
else:
print("There is no data to read!")
3、異步非阻塞io(Non-blocking, asynchronous)):服務端呼叫read()方法,若stream中無資料則回傳,程式繼續向下執行,當stream中有資料時,作業系統會負責把資料拷貝到用戶空間,然后通知這個執行緒,這里的訊息通知機制就是異步!而不是像NIO那樣,自己起一個執行緒去監控stream里面有沒有資料!
ios = IO.IOService()
device = IO.open(ios)
def inputHandler(data, err):
"Input data handler"
if not err:
print(data)
device.readSome(inputHandler)
ios.loop() # wait till all operations have been completed and call all appropriate handlers

最新2020整理收集的一些高頻面試題(都整理成檔案),有很多干貨,包含mysql,netty,spring,執行緒,spring cloud、jvm、原始碼、演算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:
756584822
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/233533.html
標籤:其他
