Le but de la communication du thread est de permettre aux threads de se envoyer des signaux. De plus, la communication du thread peut également amener le fil à attendre les signaux des autres threads. Par exemple, le thread B peut attendre les signaux du thread A, qui peuvent être un signal que le thread A a traité et terminé.
Méthode Wait ()
- Interrompez l'exécution de la méthode, faites attendre ce fil, renoncez temporairement le droit d'utiliser le CPU et permettez à d'autres threads d'utiliser cette méthode de synchronisation
Méthode notify ()
-Méré à attendre à une certaine extrémité du fil d'attente en raison de l'utilisation de cette fête synchrone
Méthode notifyall ()
Réveillez tous les fils en attente de la fin d'attente en raison de l'utilisation de cette méthode de synchronisation
Quand utiliser la méthode d'attente
Lorsqu'une variable est utilisée dans la méthode de synchronisation utilisée par un thread, et que cette variable doit être modifiée par d'autres threads pour répondre aux besoins de ce thread, vous pouvez utiliser la méthode Wait () dans la méthode de synchronisation
Ici, je prendrai un exemple dans la classe comme exemple pour décrire brièvement le rôle d'attente et de notification
Nous savons déjà que dans le multi-threading, comme la vente de billets, l'ordre des billets vendus dans chaque fenêtre est aléatoire. Si nous avons 2 Windows Windows à vendre, il est stipulé que 100 billets doivent être vendus à leur tour. Après avoir vendu un billet dans la fenêtre A, le prochain billet doit être vendu par fenêtre B. Comment implémenter cette fonction?
Tout d'abord, je pense que si la déclaration peut être définie. Si (i% 2 == 0) alors le thread 1 s'exécute, sinon le thread 2 s'exécute, mais les exécutions du thread 1 et du thread 2 sont aléatoires, et il ne peut pas être spécifié pour déterminer qui s'exécute par la taille de i.
Ensuite, nous pouvons utiliser wait () et notify () dans le fil
Une fois le fil 1 terminé, attendez un instant, puis le fil 2 est en cours d'exécution, et une fois le fil 2 terminé, puis réveillez le fil 1, puis à nouveau
Une fois le thread 1 terminé, attendez un instant, puis le fil 2 est exécuté, et une fois le fil 2 terminé, puis réveillez-vous le fil 1
De cette façon, le thread 1 et le thread 2 peuvent être exécutés à leur tour
Nous avons imprimé 10 numéros comme exemples pour écrire un programme et construit un total de 2 classes Myprint et MyPrintTest
Myprint.java
classe publique MyPrint implémente Runnable {private int i = 0; @Override public void run () {try {print ();} catch (interruptedException e) {// todo Generated Catch Block E.PrintStackTrace ();}} public synchronisé void print () throws throws InterruptedException {while (i <10) {System.out.println (thread.currentThread (). GetName () + ":" + i); i ++; notify (); try {wait ();} catch (interruptedException e) {e.printStackTrace ();}}}}Les résultats sont présentés sur la figure
Vous pouvez voir que le thread 1 et le thread 2 ont été implémentés pour imprimer alternativement les uns avec les autres.
Comprenez simplement le processus en cours d'exécution
while (i <10) {System.out.println (thread.currentThread (). getName () + ":" + i); i ++; notify (); try {wait ();} catch (interruptedException e) {e.printStackTrace ();}}}}}Lorsque je <10, imprimez le fil 1, puis effectuez un réveil. Puisqu'il n'y a pas de fil à l'avant, cette étape n'est pas exécutée. Puis file 1 attend. Après avoir exécuté le fil 2, réveille le fil précédent, c'est-à-dire le fil 1, puis imprime le fil 1,
Ce processus se poursuit jusqu'à ce que la boucle éclate, afin que nous puissions effectuer des rotations
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur la discussion brièvement du rôle de l'attente et de la notification dans la communication du fil. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!