Java NIO を使用しているときに、いくつか問題が発生しました。
のを変更する必要がinterestOps
ありkey
ます。ここには2つの方法があることがわかりました。
最初は、次の呼び出しによって行われ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
がバッファを失ったことです:
key = sockChannel.register(selector, OP_WRITE);
key.attach(buf);
sockChannel.register(selector, OP_READ);
key.attachment();// nullExcetion here!
もちろん、これはバッファを再割り当てすることで修正できますが、状況は改善されると確信しています。
洞察はありますか?