Proszę wskazać/dostarczyć mi działający przykład metody selector.wakeup();
między dwoma wątkami.java nio Wybieranie wybiórcze
Próbowałem utworzyć prosty program, w którym wątek czeka na metodę selektor.select(). Drugi wątek tworzy kilka gniazd i próbuje zarejestrować się przy pomocy selektora; na którym pierwszy wątek jest zablokowany.
Dlatego potrzebuję użyć metody selektora wakeup
, ale jakoś pierwszy wątek nie wychodzi z trybu blokowania.
Javadoc stanów czuwania Metoda:
Jeśli inny gwint jest obecnie zablokowany w wezwaniem Selector.select() lub Selector.select (długimi) Methods następnie że wywołanie powróci natychmiast.
P. S Istnieje niewiele innych obejść; jeden z nich jest wybrany (timeout), ale próbuję ustalić, gdzie jest błąd.
psuedo-code:
pierwszy wątek:
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
}
}
}
drugi wątek:
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);
}
Dziękuję Seth.Łączenie z innymi gniazdami to działanie, które działo się bardzo rzadko; dlatego żałuję, że w jakiś sposób wątek selektora nie sprawdzałby jakiejś kolekcji/zmiennej za każdym razem, gdy jest czynność na klawiszach wyboru. – Nilesh