談談NIO的優劣

2021-10-03 18:18:10 字數 1968 閱讀 9805

傳統socket程式設計,服務端**如下

public

static

void

main

(string[

] args)

catch

(ioexception e)

}}

在bio中,如果不考慮多執行緒,會有兩個地方阻塞:乙個接受連線,乙個接受資料。如果考慮多執行緒,資源消耗很大。

如何改進bio,我們假設在bio中,在阻塞的兩個地方,都讓它不阻塞(假設),同時將建立連線的socket存入集合,這樣可以通過遍歷來判斷每個socket的訊息傳送情況,假設服務端**如下

public

static

void

main

(string[

] args)

ss.setblock

(false);

// 第一步非阻塞

socket s = ss.

accept()

;if(s != null)

}catch

(ioexception e)

}}

不斷輪詢socket,看是否有資料,但是這種模式,是我們自己來控制遍歷。如果連線特別多,而大多數僅僅開啟了連線,並沒有傳送資料,會非常浪費cpu資源,但是這也是nio的基礎思想:解決了阻塞問題,統一管理socket,來獲取是否有資料互動。

nio採用的是單執行緒reactor模型,核心就是selector多路復用器,作用類似於改進bio中的list,selector機制有select,poll,epoll,在作業系統核心進行資料判別socket是否有資料,而不需要通過我們自己來控制遍歷的socket結果,大大提高了效率。同時selector可以註冊事件,比如接收連線、讀取資料等事件,針對不同事件進行單獨處理。不管是什麼事件,都會觸發事件監聽函式,通過函式結果來對建立的通道註冊不同的事件。**如下

public

class

nioserverwork

implements

runnable

catch

(ioexception e)

}public

void

stop()

@override

public

void

run(

)catch

(exception e)}}

}catch

(ioexception e)}}

/** * @param key

* @throws ioexception

* 根據selectionkey的值進行相應的讀寫操作

*/private

void

handleinput

(selectionkey key)

throws ioexception

if(key.

isreadable()

)else

if(readbytes <0)

else}}

}/**

* @param sc

* @param currenttime

* @throws ioexception

* 伺服器的業務操作,將當前時間寫到通道內

*/private

void

dowrite

(socketchannel sc, string currenttime)

throws ioexception

}

nio的優點上面已經說了,缺點也很明顯,作為單執行緒reactor模型,雖然不阻塞,但是在處理事件上,也只有一條執行緒來處理,如果a事件的處理事件很長,會影響b事件的處理

基於nio,採用的是主從reactor多執行緒模型。對於nio來說,主從就表示針對建立連線和其他事件分別用兩個selector來處理,同時在從selector使用多執行緒來處理事件

談談自定義屬性的優劣

size medium color green 備註 本文僅限於使用jquery的基礎上 color size size large 在獲取某個dom元素的時候,有多種方式,在查詢效率上肯定是最重要的。眾所周知,id是在html中是唯一的,在查詢時也是效率最高的。size size medium 控...

微軟Hyper V的優劣

以前用的虛擬機器都是vmware的,主要是微軟的virtual pc實在是功能太差了。但隨著windows2008r2的推出,微軟也非常高調的推出了hyper v虛擬機器伺服器,並作了很大力度的宣傳。最近為了研究虛擬機器方面的內容,就嘗試了一下hyper v。最後得出的結論是 有待改進。事實上,hy...

hibernate與myBatis的優劣比較

去面試已經是第三次別問到了,應該是比較常問的問題了 1 開發上手難度 hibernate的真正掌握 封裝的功能和特性非常多 要比mybatis來得難。在真正產品級應用上要用hibernate,不僅對開發人員的要求高,hibernate往往還不適合 多表關聯查詢等 2 系統調優調優方案對比 hiber...