傳統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...