7
votes

Comment avoir 2 threads se parler-ils?

Je fais actuellement un Bot IRC en Java (je sais, il existe des cadres) et j'essaie de le faire connecter à plusieurs serveurs. Le problème que je suis avec ce n'est pas la partie de connexion, je suis en train d'exécuter ma classe de connexion en x quantité de threads. Chaque thread reliera le bot au serveur / port spécifié. Maintenant, mon problème est que lorsque certains textes sont émis par un utilisateur, le bot est censé envoyer un message le canal disant "Vous avez saisi cette commande" (pour un exemple). Maintenant, je voudrais que le bot soit envoyé à tous les serveurs qui disent "vous avez tapé cette commande". Ceci est simplement juste un exemple (c'est pourquoi cela n'a pas beaucoup de sens).

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")) {
    message both servers "Hello World!" 
}


0 commentaires

6 Réponses :


0
votes

La solution la plus simple consiste à transmettre un objet commun aux deux threads. Dans ce cas, il pourrait simplement être une chaîne code> code>. Par exemple: xxx pré>

Votre autre exemple devient alors devient: p>

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")){
    messagePasser = "Hello, World!";
}


1 commentaires

Ainsi, alors vous dites que lors de l'écoute de certaines commandes du serveur, je devrais également écouter voir si le VAR change de la version perméable et si elle le ferait alors sauter les deux serveurs. J'aime cette idée, mais cela me demanderait d'avoir un certain temps à l'intérieur d'un moment et je ne suis pas sûr de la fiabilité.



3
votes

Je pense qu'une approche simple serait un modèle d'observateur où chaque fil sait à propos de tous les autres threads


0 commentaires

0
votes

La solution MessagePasser ne fonctionnera pas car les objets de chaîne en Java sont passés par la valeur, pas par référence.


2 commentaires

Bonne observation mais veuillez en faire un commentaire à cette réponse, puis supprimez ceci. Merci et bienvenue à tellement!


J'ai essayé mais je ne pouvais pas savoir comment. Après avoir lu la FAQ, j'ai réalisé que j'ai besoin d'au moins 50 points de réputation pour laisser des commentaires sur des postes qui n'ont pas été créés par moi.



0
votes

de votre description, je prends que chacun des threads attend un message d'un autre utilisateur sur le chat. En attente signifie qu'il appelle une méthode réseau qui ne renvoie que lorsqu'un message arrive. Dès que ce message arrive, le fil (éventuellement) génère une réponse, la publie puis continue d'attendre. C'est pourquoi vous avez plusieurs threads, non?

Cela signifie toutefois que les threads ne peuvent envoyer que quelque chose après avoir reçu quelque chose. Parce que seulement ils sont réveillés de leur état d'attente. Cela signifie qu'il n'est pas difficile de "diffuser" la réponse de la commande à tous les threads. Au lieu de cela, le fil de réception doit l'envoyer à tous les serveurs (tandis que les autres threads attendent toujours de lire ces serveurs).

En d'autres termes: rompre l'affectation stricte des serveurs aux fils. Laissez n'importe quel fil d'envoi à n'importe quel serveur.


1 commentaires

Voir que je pensais faire ça, mais ça rend mon code pas flexible ... du tout, et cela me fait peur lol. J'aime trop le code flexible: x.



0
votes

Ajoutez chaque fil à une collection, disons la liste et surveillez les mises à jour. Dès qu'une mise à jour est disponible, envoyez-la à chaque fil. (Cela ressemble à un observateur ...)!


0 commentaires

1
votes

Vous devez donner à chaque fil une file d'attente de messages entrants que d'autres threads peuvent pousser de manière asynchrone; Java.Util.ConCurrent.ConCurrentLinkedQueue serait probablement une bonne classe à utiliser pour cela.

Vous aurez alors besoin d'une instance de classe de messagerie unique qui a des références à tous vos discussions. Si un thread veut envoyer un message à tous les autres threads, cela appellerait Envoyer (MSG) sur cet objet Messageender global, et il ira à son tour surtout sur toutes les threads et appuyez sur le message à leurs files d'attente respectives (sauter le fil de la expéditeur).

Les threads eux-mêmes peuvent ensuite vérifier leur propre file d'attente de temps en temps (selon toute autre logique, elles peuvent être exécutées également) et supprimer des messages une fois qu'ils les ont manipulées.


1 commentaires

Au début, j'habitais à cette approche, mais c'est certainement le plus simple / le plus efficace à mettre en œuvre. Merci: D