Différence entre Sleep et Wait
Quelle est la différence entre sleep() et wait() ? – sleep() est une méthode qui permet de maintenir le processus pendant quelques secondes ou à un certain temps défini, la méthode wait() met un processus en attente, elle ne reviendra pas automatiquement active tant que nous n’appellerons pas notify() ou notifyAll().
La principale différence est que wait () libère le verrou ou le moniteur alors que sleep () ne libère aucun verrou ou moniteur en attendant juste le temps accordé. Wait est utilisé pour la communication inter-thread alors que sleep est utilisé pour introduire une pause lors de l’exécution.
Définition de Sleep
Thread.sleep() envoie le thread en cours à l’état «Not Runnable» pendant un certain temps. Le thread garde les moniteurs qu’il a acquis – par exemple, si le thread est actuellement dans un bloc ou une méthode synchronisée, aucun autre thread ne peut entrer dans ce bloc.
Si un autre thread appelle t.interrupt(), il va réveiller le thread en sommeil. Notez que sleep est une méthode statique, ce qui signifie qu’elle affecte toujours le thread en cours (celui qui exécute la méthode sleep()). Une erreur commune est d’appeler t.sleep () où t est un thread différent; alors, c’est le thread en cours qui va dormir, pas le thread t.
Exemple:
synchronized(mon_verrou) { Thread.sleep(1000); // mon_verrou est tenu }
Définition de Wait
object.wait() envoie le thread en cours à l’état «Not Runnable», comme sleep (), mais avec une différence subtile. Wait est appelé sur un objet, pas un thread; nous appelons cet objet «un verrou». Avant d’appeler lock.wait (), le thread en cours doit se synchroniser sur l’objet (le verrou); wait () libère alors ce verrou et ajoute le thread à la «liste d’attente» associée au verrou. Plus tard, un autre thread peut se synchroniser sur le même objet (le verrou) et appeler lock.notify(). Cela réveille l’original fil d’attente. Généralement, wait() / notify() est comme sleep() / interrupt(), seul le thread actif n’a pas besoin d’un pointeur direct sur le thread en sommeil, mais uniquement sur l’objet de verrou partagé.
Exemple:
synchronized(mon_verrou) { mon_verrou.wait(); // mon_verrou n'est pas tenu }
Table de comparaison
Sleep | Wait | |
---|---|---|
Appel | wait() est appelé sur un objet; le thread en cours doit se synchroniser sur l’objet verrou. | sleep() est appelé sur un thread; toujours en cours d’exécution du thread. |
Synchronisation | wait() lorsque plusieurs threads synchronisés accèdent au même objet un par un. | sleep() lorsque plusieurs threads synchronisés attendent la fin du thread en veille. |
La classe | La méthode Sleep est définie dans la classe Thread. | La méthode wait est définie dans la classe Object. |
Statique | La méthode sleep() est une méthode statique. | La méthode wait() n’est pas statique, c’est pourquoi elle nécessite un objet pour l’invoquer. |
Synchronisé | La méthode sleep() n’a pas besoin d’être appelée dans un contexte synchronisé. | La méthode wait() doit être appelée dans un contexte synchronisé. |
Exécution | La méthode sleep() est exécutée sur le thread en cours. | La méthode wait() est exécutée sur l’objet. |
Terminaison | L’exécution de la méthode sleep() est terminée lorsqu’un thread l’interrompt ou le temps est expiré. | L’exécution de la méthode wait() est terminée lorsque la méthode notify() ou notifyAll() l’interrompt. |
Exception déclenchées | InterruptedException | IllegalArgumentException, IllegalMonitorStateException, InterruptedException. |
Conclusion
Lorsque plusieurs threads souhaitent utiliser la même ressource un par un, la méthode wait() doit être utilisée. Lorsqu’un thread ne veut effectuer aucune tâche, la méthode sleep() doit être utilisée.