J'écriture d'une application client-serveur simple avec Java NIO qui a appliqué la Reactor Pattern
. à ma compréhension, la classe Reactor
est responsable de recueillir Events
(comme: OP_ACCEPT, OP_READ, OP_WRITE).gestionnaire d'événements de répartition dans des threads séparés dans le modèle de réacteur
Le relatif EventHandler
serait responsable de la tâche spécifique, donc je pense que les gestionnaires devraient fonctionner dans des threads séparés de manière asynchrone.
quand je lance cela, il montre quelques problèmes, la boucle while continuer à courir, et le Selector
garde retour readyOps ensemble de (1,4,16). Je suppose que c'est parce que la AcceptHanndler
ne pas manipuler la OP_ACCEPT
de la manière de blocage, si l'événement est la clé supprimer dans le iterator, après une select()
, il montrerait à nouveau. Donc ne devrais-je pas prendre le eventHander en tant que runnable?
Le concept de edge-triggered
et level-triggered
modèles vient à l'esprit ... ne la raison est parce que le sélecteur est runing dans level-triggered
modèle?
Le point entier de Selectors est chapeau que vous * ne * devez utiliser des threads séparés. – EJP
Le point de 'Selector' est de gérer plusieurs socket dans un thread, je n'ai pas utilisé de thread par client. – JasonHuang
Vous faites bien pire que ça. Vous utilisez essentiellement un thread * par événement de sélection *. Vous devez exécuter les gestionnaires dans le thread en cours et utiliser uniquement des threads auxiliaires pour les événements de longue durée tels que les accès à la base de données *, après avoir terminé l'acceptation ou la lecture ou l'événement dans le thread en cours. Votre modèle de base est cassé .. – EJP