在使用Java NIO时,我遇到了一些问题。
我需要
更改
interestOps
的
key
。我发现这里有两种方法。
第一
通过调用
key.interestOps()
:
key.interestOps(OP_READ)
然而,我遇到了一个非常棘手的问题
线程安全
问题如下:
key.interestOps(OP_WRITE);
sl.select();
Iterator iter = sl.selectedKeys().iterator();
log(iter.toArray().length); // Sometimes, I got 0 here!
有趣的是,我有时在日志中得到0(但有时效果很好)。但在其他线程中并没有显式修改键。我不明白
line2
和
line3
.
另一个
方法是
register
再一次:
问题是新退货
钥匙
失去缓冲:
key = sockChannel.register(selector, OP_WRITE);
key.attach(buf);
sockChannel.register(selector, OP_READ);
key.attachment();// nullExcetion here!
当然,这可以通过重新分配缓冲区来解决,但我相信情况会更好。
有什么见解吗?