Explication détaillée et exemples de Java Thread Sleep () et Wait ()
dormir
1. Le sommeil est une méthode statique de fil. Cela permet aux threads implémentés par Runnable d'utiliser la méthode de sommeil. Il évite également d'appeler la méthode du sommeil () les uns aux autres avant les threads pour provoquer des blocs de bloces.
2. Sleep () doit avoir un temps de sommeil lors de l'exécution. Pendant le sommeil (pendant le blocage du fil), le CPU abandonnera ce fil et effectuera d'autres tâches. Lorsque l'heure de sommeil est écoulée, le fil se réveillera automatiquement, mais le fil ne sera pas exécuté immédiatement, mais attendra que le CPU alloue les ressources pour rivaliser avec d'autres threads.
3. De plus, si ce fil acquiert une serrure auparavant, la serrure ne sera pas libérée pendant le sommeil. D'autres programmes en attente de ce verrou de machine doivent attendre que ce fil se réveille et s'exécute après l'exécution.
Code lié au sommeil
classe publique threadTest2 {public static void main (String [] args) {System.out.println ("Begin Our Test"); ThreadSleep Sleep = New ThreadSleep (); essayez {thread thread1 = nouveau thread (sommeil, "passant a"); Thread Thread2 = nouveau thread (sommeil, "passeur B"); thread1.start (); thread2.start (); } catch (exception e) {e.printStackTrace (); } System.out.println ("Le test est terminé"); }} classe ThreadSleep implémente runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "dire: bonjour somnolence !!"); compter(); } public void count () {while (count <20) {System.out.println (thread.currentThread (). getName () + "Say: Count is" + Count); essayez {count ++; Thread.Sleep (100); } catch (exception e) {e.printStackTrace (); }}}}Journal de sortie
Commencer notre test est sur le passant un dit: Bonjour le sommeil !! Passeur A dit: Count est 0 Passeur B dit: Bonjour le sommeil !! Le passant B dit: le nombre est 1 passant A dit: le nombre est 2 passant B dit: le nombre est 2 passant A dit: le nombre est de 4 passants B dit: le nombre est 4 passant A dit: le compte est 6 passant B dit: le compte est 7 passant B. Le passant B dit: le compte est de 14 passant, A dit: le nombre est de 14 passants A dit: le compte est 16 passant B dit: le compte est 16 passant A dit: le compte est 18 passant B dit: le compte est 18
Grâce au journal, nous pouvons constater que le thread A et le thread B sont essentiellement exécutés alternativement, mais ils sont irréguliers et ont des problèmes de concurrence.
Cette situation est dû au fait que le code fait le temps de sommeil à 100 millisecondes. Étant donné que le nombre d'incréments, la vitesse d'exécution est très rapide, le fil dort presque en même temps, puis se réveille en même temps et provoque la concurrence.
Ensuite, vous devez ajouter un bloc synchronisé pour vérifier si le verrouillage de chronométrage du sommeil est libéré
classe publique threadTest2 {public static void main (String [] args) {System.out.println ("Begin Our Test"); ThreadSleep Sleep = New ThreadSleep (); essayez {thread thread1 = nouveau thread (sommeil, "passant a"); Thread Thread2 = nouveau thread (sommeil, "passeur B"); thread1.start (); thread2.start (); } catch (exception e) {e.printStackTrace (); } System.out.println ("Le test est terminé"); }} classe ThreadSleep implémente runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "dire: bonjour somnolence !!"); compter(); } public void count () {while (count <20) {synchronisé (this) {System.out.println (thread.currentThread (). getName () + "Say: Count is" + Count); essayez {count ++; Thread.Sleep (100); } catch (exception e) {e.printStackTrace (); }}}}}}Journal de sortie
Commencez notre passant de test A dit: Bonjour le sommeil !! Le passant A dit: Count est 0-test est sur le passant B dit: Bonjour le sommeil !! Le passant a dit: le nombre est 1 passant A dit: le nombre est 2 passant A dit: le nombre est 3 passant A dit: le nombre est 4 passant A dit: le nombre est 5 passant A dit: le compte est 6 passant A dit: le compte est 7 passant A dit: le comte est: le comte est 11 passher 13-PASSER A Dit: Count est 14-PASSER A dit: Count est 15-Passateur A dit: Count Is 16-Passer A dit: Count est 17-PASSER A dit: Count est 18-Passer A dit: le compte est le 19-PASSER B dit: Le nombre est de 20
Il peut être vu à partir du journal que le thread A s'exécute essentiellement. En effet, pendant le sommeil, le verrouillage de la machine est toujours sur le fil A, donc le fil B ne peut qu'attendre que le fil A libère le verrou.
attendez
1.Wait () est une méthode de la classe d'objets. Lorsque la méthode Wait () est appelée, le thread entre dans le pool d'attente associé à l'objet et libère le verrou qu'il a.
2. Après avoir exécuté Wait (), vous devez utiliser la méthode Notify () ou NOTIFYALL () ou définir le temps d'attente (attendre (longtemps)) pour réveiller le fil dans le pool de threads en attente.
3.Wait () doit être placé dans le bloc synchronisé, sinon l'exception "java.lang.LelegalMonitorStateException" sera signalée lors de l'exécution.
Code lié à l'attente
classe publique threadTest2 {public static void main (String [] args) {System.out.println ("Begin Our Test"); ThreadSleep Sleep = New ThreadSleep (); essayez {thread thread1 = nouveau thread (sommeil, "passman a"); Thread Thread2 = nouveau thread (Sleep, "Passman B"); thread1.start (); thread2.start (); } catch (exception e) {e.printStackTrace (); } System.out.println ("Le test est terminé"); }} classe ThreadSleep implémente runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "dire: bonjour somnolence !!"); compter(); } public void count () {while (count <20) {synchronisé (this) {System.out.println (thread.currentThread (). getName () + "Say: Count is" + Count); essayez {count ++; this.Wait (100); } catch (exception e) {e.printStackTrace (); }}}}}}Journal de sortie
Commencez notre passant de test A dit: Bonjour le sommeil !! Le passant A dit: Count est 0-test est sur le passant B dit: Bonjour le sommeil !! Le passant B dit: le nombre est 1 passant A dit: le nombre est 2 passant B dit: le nombre est de 3 passants A dit: le compte est 4 passant B dit: le nombre est 5 passant A dit: le compte est 6 passant B dit: le compte est 7 passant A dit: le comte est le nombre de passants est 11 passher Le passant B dit: le compte est de 14 passant, A dit: le nombre est de 15 passant B dit: le compte est 16 passant A dit: le nombre est de 17 passants B dit: le compte est 18 passant A dit: le compte est 19
Grâce au journal, on peut constater qu'en cas d'attente, la serrure sera publiée.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!