概述
? java nio可以被稱為java new io,因?yàn)槠涮峁┝艘环N有別于傳統(tǒng)java io的io工作方式捎谨。同時(shí)张漂,由于java nio是同步非阻塞的冕杠,其也被稱為non-blocking io(非阻塞io)。但是洼哎,為什么java nio是同步非阻塞的烫映?本文將對(duì)這個(gè)問(wèn)題進(jìn)行深入的解析。
概念解析
? 在對(duì)本文的問(wèn)題進(jìn)行分析之前噩峦,我們先看下同步異步锭沟,阻塞非則塞者兩對(duì)概念。
(1)同步和異步
? 同步和異步描述的是一種消息通知的機(jī)制壕探,主動(dòng)等待消息返回還是被動(dòng)接受消息冈钦。同步io指的是調(diào)用方通過(guò)主動(dòng)等待獲取調(diào)用返回的結(jié)果來(lái)獲取消息通知,而異步io指的是被調(diào)用方通過(guò)某種方式(如李请,回調(diào)函數(shù))來(lái)通知調(diào)用方獲取消息瞧筛。
(2)阻塞非阻塞
? 阻塞和非阻塞描述的是調(diào)用方在獲取消息過(guò)程中的狀態(tài),阻塞等待還是立刻返回导盅。阻塞io指的是調(diào)用方在獲取消息的過(guò)程中會(huì)掛起阻塞较幌,知道獲取到消息,而非阻塞io指的是調(diào)用方在獲取io的過(guò)程中會(huì)立刻返回而不進(jìn)行掛起白翻。
為什么java nio是同步非阻塞的乍炉?
? 我們知道java nio是基于io多路復(fù)用模型,也就是我們經(jīng)常提到的select滤馍,poll岛琼,epoll。io 多路復(fù)用本質(zhì)是同步io巢株,其需要調(diào)用方在讀寫(xiě)事件就緒時(shí)主動(dòng)去進(jìn)行讀寫(xiě)槐瑞。在java nio中,通過(guò)selector來(lái)獲取就緒的事件阁苞,當(dāng)selector上監(jiān)聽(tīng)的channel中沒(méi)有就緒的讀寫(xiě)時(shí)間時(shí)困檩,其可以直接返回祠挫,或者設(shè)置一段超時(shí)后返回〉垦兀可以看出java nio可以實(shí)現(xiàn)非則塞等舔,而不像傳統(tǒng)io里必須則塞當(dāng)前線程直到可讀或可寫(xiě)。所以糟趾,java nio可以實(shí)現(xiàn)非阻塞慌植。我們簡(jiǎn)單看下java nio處理連接和java socket 處理連接的方式:
//java nio
while(true) {
......
selector.select(1);
Set<SelectionKey> selectionKeySet= selector.selectedKeys();
......
//處理selectionKeySet中事件,線程沒(méi)有阻塞
}
//java socket處理連接,線程會(huì)阻塞
while(true) {
......
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
......
//處理in中內(nèi)容
}
? 本文篇幅很短义郑,只是為了說(shuō)明本人最近的疑慮涤浇,因?yàn)橹拔乙恢庇X(jué)得java nio也是阻塞的。希望本文可以對(duì)有相似疑慮的同學(xué)有所幫助魔慷,共同成長(zhǎng)只锭!
原文
袁瓊瓊的技術(shù)博客,歡迎指針
http://yuanqiongqiong.cn/2019/07/04/%E4%B8%BA%E4%BB%80%E4%B9%88java-nio%E8%A2%AB%E7%A7%B0%E4%B8%BA%E5%90%8C%E6%AD%A5%E9%9D%9E%E9%98%BB%E5%A1%9Eio/