Reactor設計模式

2021-09-01 21:57:29 字數 2419 閱讀 4467

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、socketchannelattach功能將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模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...