selector.wakeup();
2つのスレッド間のメソッドの実例を教えてください。
スレッドがselector.select()メソッドを待機している単純なプログラムを作成しようとしました。2番目のスレッドはいくつかのソケットを作成し、セレクターに登録しようとします。最初のスレッドがブロックされます。
したがって、セレクターのwakeup
メソッドを使用する必要がありますが、どういうわけか、最初のスレッドはブロッキングモードから出ません。
wakeupメソッドのjavadocには次のように記載されています。
Selector.select()またはSelector.select(long)メソッドの呼び出しで別のスレッドが現在ブロックされている場合、その呼び出しはすぐに返されます。
PS他の回避策はほとんどありません。そのうちの1つはselect(timeout)ですが、どこに間違いがあるのかを突き止めようとしています。
疑似コード:
最初のスレッド:
static Selector selector = Selector.open();
while(true) {
int n = selectorGlobal.select();
selectorKeySet = selectorGlobal.selectedKeys().iterator();
while (selectorKeySet.hasNext()) {
selectionKey = selectorKeySet.next();
if (selectionKey.isReadable()) {
//do something
}
if(selectionKey.isAcceptable()) {
//accept
}
}
}
2番目のスレッド:
while (itr.hasNext()) {
data = (String) itr.next();
String IP = data.get(0);
String Port = data.get(1);
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
boolean isConnected = socketChannel.connect(new InetSocketAddress(IP, Port));
ClassName.selector.wakeup();
SelectionKey selectionKey = SelectSockets.registerChannel(ClassName.selector,
socketChannel, SelectionKey.OP_READ);
}