7
votes

Communication entre le fil parent et enfant en Java

J'ai un fil principal et dans ce fil, je commence un nouveau fil. (le fil de l'enfant). Ce fil enfant ouvre une prise de serveur et commence à écouter une connexion. Je souhaite que le thread arrête son exécution et fermez tout ce qu'il a initialisé (comme la prise) lorsque le thread principal reçoit un message de l'extérieur (de l'endroit où il reçoit le message n'est pas la préoccupation). Comment devrais-je arrêter le fil et fermer toutes les connexions est ce que je veux.

Devrais-je utiliser une variable partagée? Donc, lorsque le fil principal reçoit le message, il doit le modifier et que le thread enfant doit vérifier en permanence les modifications de cette variable partagée?

Comment dois-je le mettre en œuvre? Certains liens utiles peuvent aider ou un exemple de code?

Qu'est-ce que j'ai essayé est le suivant: Dans le fil principal, j'ai déclaré une variable xxx

lorsque le fil principal reçoit le message, il définit xxx

et Le fil écoute le changement comme suit: xxx

mais le code ci-dessus ne fonctionne pas du tout. Comment devrais-je le faire?


4 commentaires

Je vais essayer de vous revenir à vous ... Mais qu'est-ce qui ne va pas dans mon code?


le drapeau est changé seulement pour votre fil parent, le fil enfant le voit toujours comme "0"


Faites le drapeau volatil. Drapeau INT volatile privé; .


Si quelqu'un d'entre vous peut résoudre une question sur Android-Bluetooth Pls, vérifiez cela pour moi Stackoverflow.com/Questtions/16413498/...


4 Réponses :


3
votes

filetage enfant code> strud>

Vous devez faire une nouvelle fonction ici, Fe: p> xxx pré>

thread parent code> fort> p>

Chaque fois que vous voulez tuer / arrêter d'écouter / ... dans le fil de l'enfant, appellez-vous à: P>

 public ChildThread implements Runnable
{
    private int flag = 0;

    public ChildThread()
     {  }

    public void setFlag(int i)
      {
         flag = i;
      }
    public void run()
      { 
       //your code
      }
    ....
}


10 commentaires

Je ne suis pas capable d'appeler enfilthead.setflag (1) à partir du fil principal ..... Il montre une erreur.


changer "enfilemead" pour le nom de votre fil d'enfant actuel; )


t.setflag (1), et dans le fil, j'ai un vide public SetFlag (int i) {drapeau = i}


N'y a-t-il pas de discussion ici? afin que je puisse poster tout le code à vous


Avez-vous plus de classes définies avec le même nom? Renommez votre .java. Essayez également de nettoyer votre projet en premier. Il semble y avoir un problème avec le nom de vos cours ..


No.My Code pour le thread est comme suit: thread t = nouveau thread (nouveau runnable () {Public Void Exécuter () {// Initialiser une prise de serveur tandis (true) {if (read_flag == 1) {pause;} Sock1 = serveur_sok.accept ();}} public int lecture_flag () {drapeau de retour;} Public Void Seflag (int i) {falg = i}});


et du fil principal, j'essaie d'appeler t.setflag (1) lorsque le message particulier arrive


D'accord, vous faites de nouveaux runnables dans votre parent. Avez-vous besoin de ces fils d'enfant pour être anonyme ou vous pouvez en créer de nouveaux?


Ce que je veux dire, c'est que ceci: pouvez-vous faire, de votre fil parent, cet appel? Childthead t = nouvelle enfance (); -> Cela étant une autre classe, avec son constructeur. Cette classe implémente également et a une méthode exécutée (). À l'intérieur de cette classe, vous mettez la fonction SetFlag, puis, vous pouvez faire appel à l'appel du parent de cette façon: Childthead T = nouvelle enfance (); t.start (); // cela rendra le thread entrer la méthode exécutée (); Et quand tu veux: t.setflag (i); ...


Pouvez-vous passer à travers cette question et voir si vous pouvez résoudre le problème ?? c'est sur Android-Bluetooth




0
votes

Si vous utilisez un drapeau pour signaler un thread pour arrêter, assurez-vous que l'accès à la lecture / écriture est synchronisé. Par exemple: xxx