reactor和thread线程_Java多线程 Reactor模式和NIO - 解道Jdon

public class Reactor implements Runnable{

final Selector selector;

final ServerSocketChannel serverSocket;

Reactor(int port) throws IOException {

selector = Selector.open();

serverSocket = ServerSocketChannel.open();

InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);

serverSocket.socket().bind(address);

serverSocket.configureBlocking(false);

//向selector注册该channel

SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);

logger.debug("-->Start serverSocket.register!");

//利用sk的attache功能绑定Acceptor 如果有事情,触发Acceptor

sk.attach(new Acceptor());

logger.debug("-->attach(new Acceptor()!");

}

public void run() { // normally in a new Thread

try {

while (!Thread.interrupted())

{

selector.select();

Set selected = selector.selectedKeys();

Iterator it = selected.iterator();

//Selector如果发现channel有OP_ACCEPT或READ事件发生,下列遍历就会进行。

while (it.hasNext())

//来一个事件 第一次触发一个accepter线程

//以后触发SocketReadHandler

dispatch((SelectionKey)(it.next()));

selected.clear();

}

}catch (IOException ex) {

logger.debug("reactor stop!"+ex);

}

}

//运行Acceptor或SocketReadHandler

void dispatch(SelectionKey k) {

Runnable r = (Runnable)(k.attachment());

if (r != null){

// r.run();

}

}

class Acceptor implements Runnable { // inner

public void run() {

try {

logger.debug("-->ready for accept!");

SocketChannel c = serverSocket.accept();

if (c != null)

//调用Handler来处理channel

new SocketReadHandler(selector, c);

}

catch(IOException ex) {

logger.debug("accept stop!"+ex);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值