Question

S'il vous plaît pointer / me donner un exemple de travail de la méthode de selector.wakeup(); entre deux fils.

J'ai essayé de créer un programme simple où un fil est en attente sur la méthode de selector.select (). fil deuxième crée des prises de courant et tente d'enregistrer avec le sélecteur; sur lequel le premier fil est bloqué.

Par conséquent je dois utiliser la méthode de wakeup de sélecteur, mais en quelque sorte le premier fil isnt ne sort pas du mode de blocage.

La méthode de javadoc réveil qui suit:

  

Si un autre thread est actuellement bloqué   dans une invocation du   Selector.select () ou   méthodes de Selector.select (longues) puis   cette invocation retourne   immédiatement.

P.S Il y a peu d'autres travaux autour; l'un d'eux est select (délai d'attente) mais je suis en train de comprendre où l'erreur est.

Le code psuedo:

FIRST FILET:

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
      }
   }
}

DEUXIÈME FILET:

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);

}
Était-ce utile?

La solution

Vous ne voulez probablement pas avoir la prise de fil 2 se bloque si vous il vous inscrivez dans un sélecteur (comme sélecteurs sont destinés à non bloquante E / S). Je pense qu'il est aussi pratique courante de laisser le sélecteur gérer la connexion avec op_connect (en utilisant SocketChannel.finishConnection ()).

Il semble aussi que vous pourriez avoir une condition de course potentiel ici. Imaginez cette série d'événements:

  1. Discussion 1: selector.select ()
  2. ... le temps passe ...
  3. Discussion 2: Thread1.selector.wakeup ()
  4. Discussion 1: clés vérifie d'acceptabilité
  5. Discussion 1: contrôles clés pour readibility
  6. Discussion 1: boucle
  7. Discussion 1: selector.select ()
  8. Discussion 2: essayez d'enregistrer dans le sélecteur (mais il est trop tard pour cette select ())

Je vous suggère d'avoir cette discussion 2 a mis en place un SocketChannel, planquer quelque part cette discussion 1 peut nous mettre au travail (assurez-vous d'être thread-safe quand vous faites cela), puis se réveiller le sélecteur, laissez-le vérifier est les clés existantes dans cette discussion 1 et ont Thread 1 enregistrer les nouveaux SocketChannel avant qu'il appelle Selector.select () à nouveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top