最近在写reactor的多线程模型时,遇到了一些意料之外的收获,便将博客记录在这里。
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while (iterator.hasNext()){
SelectionKey key = iterator.next();
Runnable runnable = (Runnable) key.attachment();
if (runnable instanceof Acceptor)
runnable.run();
else if (runnable instanceof Handler)
threadPool.execute(runnable);
iterator.remove();
}
先简单介绍下这段代码,主线程会不停的进行select操作,来捕获IO就绪的各种事件,包括连接操作,包括读操作等等。
如果是连接操作,便会在主线程里完成连接。
如果是读操作,便会在线程池里完成读取操作。
在使用netcat进行连接,然后发送数据给server端时,奇怪的事情发生了。
threadPool.execute(runnable);
这段代码被重复的执行了好几次(有时候4次,有时候5次),由于是读取操作,因此第一次执行能读取出数据,后面读取的数据均为空。
将这段代码改成如下同步执行的样子,发现没有任何问题。
runnable.run();
思考了好