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? P>
Comment dois-je le mettre en œuvre? Certains liens utiles peuvent aider ou un exemple de code? P>
Qu'est-ce que j'ai essayé est le suivant:
Dans le fil principal, j'ai déclaré une variable p> lorsque le fil principal reçoit le message, il définit p> et Le fil écoute le changement comme suit: p> mais le code ci-dessus ne fonctionne pas du tout. Comment devrais-je le faire? P> p>
4 Réponses :
Vous devez faire une nouvelle fonction ici, Fe: p> Chaque fois que vous voulez tuer / arrêter d'écouter / ... dans le fil de l'enfant, appellez-vous à: P> filetage enfant code> strud>
thread parent code> fort> p>
public ChildThread implements Runnable
{
private int flag = 0;
public ChildThread()
{ }
public void setFlag(int i)
{
flag = i;
}
public void run()
{
//your code
}
....
}
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); ...
étendre code Votre classe de sorte que vous puissiez arrêter l'exécution du dans votre équivalent de la fonction code> () code> fonctionner, faites tout votre nettoyage p> < / p> runnable code> avec votre propre implémentation:
exécutable code>, vous trouvera un bon exemple de comment faire ici ici Comment arrêter correctement le Fil en Java? . Assurez-vous de regarder les
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:
La bonne façon d'interrompre un thread est via le mécanisme d'interruption. Dans votre fil principal, lorsque vous souhaitez arrêter le fil de l'enfant, vous appelez:
public void run() { try { while (!Thread.currentThread.isInterrupted) { sock1 = Ssocket.accept(); //rest of the code here } } catch (InterruptedException e) { Thread.currentThread.interrupt(); //good practice } //cleanup code here: close sockets etc. }
Comment devrais-je le fermer de l'extérieur? Seul mon fil d'enfant a la connaissance de la prise ..... ou devrais-je le déclarer quelque part en dehors de l'enfant fil? dans le fil principal?
Vous pouvez fournir une méthode code> CloseSocket code> dans votre fil d'enfant qui ferme la prise (et rend le accepter code> lancer une exception). Vous auriez besoin de l'appeler d'un fil différent bien sûr.
Pouvez-vous s'il vous plaît suivre cette question et voir si vous pouvez résoudre le problème ?? C'est sur Android -Bluetooth
@ user2354443 Je n'ai jamais utilisé la connectivité Bluetooth alors ne peut pas vraiment aider.
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é; code>.
Si quelqu'un d'entre vous peut résoudre une question sur Android-Bluetooth Pls, vérifiez cela pour moi Stackoverflow.com/Questtions/16413498/...