Por favor, señalar/proporcionarme un ejemplo de trabajo del método selector.wakeup();
entre dos hilos.java nio Selector de activación
Intenté crear un programa simple donde un hilo está esperando en el método selector.select(). El segundo subproceso crea algunos sockets e intenta registrarse con el selector; en el que el primer hilo está bloqueado.
Por lo tanto, necesito usar el método selector wakeup
, pero de alguna manera el primer hilo no sale del modo de bloqueo.
el Javadoc de estados del método de activación:
Si otro hilo está bloqueado actualmente en una invocación de la Selector.select() o Selector.select métodos (de largo) a continuación, que la invocación volverá inmediatamente.
P.S Hay algunas otras soluciones alternativas; uno de ellos es select (timeout) pero estoy tratando de descubrir dónde está el error.
El pseudo-código:
primer hilo:
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
}
}
}
segundo hilo:
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);
}
Gracias Seth.Conectarse a otros enchufes es una actividad que ocurriría muy raramente; por lo tanto, deseé de alguna manera que el hilo del selector no verificara alguna colección/variable cada vez que haya actividad en las teclas de selección. – Nilesh