banq,怎么不回我帖呢?给别人回,都不给我回,你是不是只挑你能回答的,答不了的就装没看见!

06-02-09 xh
上次发的文章,点这里,就是第一章的第一个代码的run的执行过程!

public class TCPReactor implements Runnable {

private final static String module = TCPReactor.class.getName();

private final Selector selector;
private final ServerSocketChannel ssc;

public TCPReactor(int port) throws IOException {

selector = Selector.open();
ssc = ServerSocketChannel.open();

InetSocketAddress address =
new InetSocketAddress(InetAddress.getLocalHost(), port);
ssc.socket().bind(address);
Debug.logVerbose("-->Start host:" + InetAddress.getLocalHost() + " port=" +
port);

ssc.configureBlocking(false);
//向selector注册该channel
SelectionKey sk = ssc.register(selector, SelectionKey.OP_ACCEPT);

//利用sk的attache功能绑定Acceptor 如果有事情,触发Acceptor
sk.attach(new Acceptor(selector, ssc));

Debug.logVerbose("-->TCP Server started");
}

public void run() {

while (true) {
try {

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) {
Debug.logError("reactor error" + ex, module);
}

}
}

//运行Acceptor或SocketReadHandler
private void dispatch(SelectionKey key) {
Runnable r = (Runnable) (key.attachment());
if (r != null) {

r.run();
}
}
}
public class Acceptor implements Runnable {

private final Selector selector;
private final ServerSocketChannel ssc;

public Acceptor(Selector selector, ServerSocketChannel ssc) {
this.selector = selector;
this.ssc = ssc;

}

public void run() {
try {
SocketChannel sc = ssc.accept();
if (sc != null) {
sc.configureBlocking(false);
SelectionKey sk = sc.register(selector, 0);

//同时将SelectionKey标记为可读,以便读取。
sk.interestOps(SelectionKey.OP_READ);
selector.wakeup();

sk.attach(new TCPHandler(sk, sc));
}

} catch (Exception ex) {
Debug.logVerbose("accept stop!" + ex);
}
}

}

这里的dispatch的run是执行谁的run,是Acceptor的还是TCPReactor的.
我又想了遍,好象是Acceptor(由于attach作用)的,是不是?

banq你又不回我帖嘛

banq
2006-02-09 19:05
线程我很长时间没有碰了,所以不是很记得,本站有专门这方面文章,你可仔细研究。

http://www.jdon.com/concurrent.htm

xh
2006-02-09 23:08
就只问你一点dispatch的run是运行Acceptor还是TCPReactor?这个你总该知道了吧!

ishow99
2006-02-10 11:36
鄙视楼主! 你不尊重人家,谁会给你回啊!小菜就谦虚点...凸-_-凸

banq
2006-02-10 12:02
>只问你一点dispatch的run是运行Acceptor还是TCPReactor
在我上面推荐的文章中对于Dou lee的reactor原理已经解释得很清楚:

http://www.jdon.com/concurrent/reactor.htm


上面的引图很清楚吧,这是Dou Lee画的。

从图中不是可以明白看出你要的的答案吗。

xh
2006-02-10 21:13
是这样理解吗?dispatch还是运行的Reactor中的run,但一开始就先有Acceptor发生,并随时改变key,那么被产生的dispatch又引发相应已被注册key的相应个数的线程,这些线程又都有各自的Handler.

是这样的吗?

xh
2006-02-12 10:00
banq,你回答个我是还是不是呀!从我上回发的这个帖"http://www.jdon.com/jive/thread.jsp?forum=61&thread=25057"2006年2月5号开始到现在多少天了,每次我怀着无比的热情与疑问急切的等待着你的回复,可你总是隔一天给我那么两个字(还是没有结果的那种),一次一次给我泼凉水,想弄明白一个问题,让你耗费我7天时间(今天12号),你可够大牌了.我又等你两天了,不得已写上这些.难道我非得加上这些字眼,请,求,跪.你才看着舒服,然后隔那么几天,高兴了就回两个字.
真不明白你什么意思是故作高深呢还是什么呢!我就当你是启发学生,让他在那里死想那么几天.
还有这个自反应原理虽然不是你发明的,可你懂呀,你回答个是还是不是都不行吗?别用你忘了什么的来敷衍我(我觉的你应该是懂这个原理的).
其余各位觉得我冲的,可以看看我发的这个http://www.jdon.com/jive/thread.jsp?forum=61&thread=25057
,到现在这篇贴.看看每次我的发言与回复,觉得还想骂我就骂吧!我想知道为了一个问题,我能得到什么结果,是花费无数的时间与精力却换来一无所获还是得来冷眼相待,又或是什么.

各位多给我回帖,帮我顶下!

harling909
2006-04-23 21:54
lz看这句话:sk.attach(new Acceptor(selector, ssc));
因此dispatch中的run调用是的key.attachment()所返回的实现Runnable的对象,即Acceptor中的run。
不过我认为这里应该这么写才对:
(new Thread(r)).start();否则的话虽然可以运行起来,但不是线程调用。

恕我直言:我认为这个问题属于你看程序没有看清,所以我觉得板桥对于这个问题觉得没有必要回答。

Harling909

harling909
2006-04-23 21:54
lz看这句话:sk.attach(new Acceptor(selector, ssc));
因此dispatch中的run调用是的key.attachment()所返回的实现Runnable的对象,即Acceptor中的run。
不过我认为这里应该这么写才对:
(new Thread(r)).start();否则的话虽然可以运行起来,但不是线程调用。

恕我直言:我认为这个问题属于你看程序没有看清,所以我觉得板桥对于这个问题觉得没有必要回答。

Harling909

猜你喜欢