Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question sur la classe java.nio.channels.Selector

2 réponses
Avatar
Vincent Cantin
Est-il correcte de faire :

Selector selector = Selector.open();
selector.select();

et un "myServerSocketChannel.register(selector, SelectionKey.OP_READ,
myConnection);" a partir d'un autre thread pendant que le premier est
endormi sur la fonction select() ?

--
Vincent

2 réponses

Avatar
Marc Petit-Huguenin
Vincent Cantin wrote:
Est-il correcte de faire :

Selector selector = Selector.open();
selector.select();

et un "myServerSocketChannel.register(selector, SelectionKey.OP_READ,
myConnection);" a partir d'un autre thread pendant que le premier est
endormi sur la fonction select() ?



Il faut faire un wakeup sur le selector pour que le register soit pris
en compte:


private final Selector selector;
private final Object lock = new Object();


void register(SelectableChannel channel) {
synchronized (lock) {
selector.wakeup();
channel.register(selector, 0, null);
}

public void run() {
while (true) {
synchronized (lock) {}
selector.select();
// selected keys processing...
}
}

Avatar
Vincent Cantin
Il faut faire un wakeup sur le selector pour que le register soit pris
en compte:


private final Selector selector;
private final Object lock = new Object();


void register(SelectableChannel channel) {
synchronized (lock) {
selector.wakeup();
channel.register(selector, 0, null);
}

public void run() {
while (true) {
synchronized (lock) {}
selector.select();
// selected keys processing...
}
}


Wow, bien trouve l'astuce du lock :-)
C'est cool, je pense que ca resoud exactement mon probleme.
Merci infiniment !

Vincent