nio用到的reactor設計模式,下面的說明比較清楚,留作記錄。
reactor設計模式和觀察者模式非常相似,但是它比觀察者模式複雜,reactor設計模式使用乙個selector物件相當於觀察模者式裡面的觀察者,每個
socketserverchannal 例項和socketchannal例項都相當於被觀察者,當然它們需要在selector物件裡面註冊,它們註冊之後每個channal例項都會分配乙個 selectionkey物件,selectionkey物件可以attach(附帶)乙個物件,當selector裡面註冊的channal有事件發生 時,selector就會產生乙個遍歷,這時候可以在遍歷的時候用attachment()方法把每個selectionkey裡面attach的物件o 提出來,你可以在這個時候執行在o物件所屬類o裡面所定義的方法,在這個方法裡面可以使用socket.read()方法進行讀取網路資料,將資料讀出 後,可以將這些資料處理執行緒做成乙個執行緒池,這樣,資料讀出後,立即扔到執行緒池中,這樣加速處理速度。
注意在每次遍歷提出selectionkey,對註冊的channal的讀或寫進行處理完畢之後,需要對channal進行重新註冊,重新attach()物件。
使用nio提供的reactor設計模式,我們可以設計乙個高效能nio伺服器:
1、啟動乙個實現runnable介面的reactor,在reactor的構造方法裡面使用selector.open()方法例項化乙個selector。
2、開啟乙個serversocketchannal,**:
serversocketchannel serversocket = serversocketchannel.open();
inetsocketaddress address = new inetsocketaddress(inetaddress.getlocalhost(),port);
serversocket.socket().bind(address);
serversocket.configureblocking(false);
3、將serversocketchannal在selector裡進行註冊,**:
selectionkey sk =serversocket.register(selector,selectionkey.op_accept);
4、給sk附帶上乙個事件處理物件,**:
sk.attach(new acceptor());
5、在reactor類的run方法裡面對selector不停的迴圈掃瞄,如果發現註冊的channal裡面有op_accept或read事件發生,有的話就觸發乙個selector附帶上的事件處理物件執行緒,處理完畢之後須將所有註冊的事件清空,**如下:
public void run()
selected.clear();
}catch (ioexception ex)
}void dispatch(selectionkey k)
}6、我們可以在serversocketchannal註冊的sk裡附帶下面的事件處理類的物件(注意這是乙個內部類):
class acceptor implements runnable
catch(ioexception ex) }}
7、socketchannel的attach功能將hanlder和可能會發生事件的channel鏈結在一起,當發生事件時,可以立即觸發相應 鏈結的handler。我們在事件處理類裡面需要做的事情是在selector裡面註冊socketchannal,並附帶上本handler,下一步有 事件觸發時會呼叫本類的run方法:
public class socketreadhandler implements runnable
public void run() catch(exception ex)
}private void readrequest() throws exception catch(exception e) }
reactor設計模式
reactor設計模式,是一種基於事件驅動的設計模式。pattern oriented software architecture,volume 2 對這個模式做了詳細的講解。這個模式的結構圖如下 圖中的handle對應的是作業系統提供的控制代碼,例如i o控制代碼,event handler類持有...
設計模式 reactor
先看個段子吧,更好理解 reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,...
Reactor設計模式
reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...