« Salut Amigo ! »

"Maintenant, je vais vous parler un peu des méthodes de sommeil, de rendement et de jointure."

"C'est ennuyeux. Je viens de trouver une question d'entretien : 'Quelle est la différence entre les méthodes yield (), sleep () et wait () ?'. Pouvez-vous expliquer cela ?"

"Pas de problème. Tout d'abord, ce sont trois méthodes complètement différentes."

1) sleep(timeout)  – arrête le thread en cours (sur lequel sleep a été appelé) pendant le nombre de millisecondes indiqué par le paramètre timeout. Le thread passe alors dans l'état TIMED_WAITING. La méthode peut se terminer plus tôt si l'indicateur isInterrupted est défini.

Exemple Description
Thread.sleep(500);
Le thread actuel suspend sa propre exécution pendant 500 millisecondes, soit 0,5 seconde.

2) yield ()  - le thread actuel "saute son tour". Le thread passe de l'état en cours d'exécution à l' état prêt , et la JVM passe au thread suivant. Les états running et ready sont des sous-états de l' état RUNNABLE .

Exemple Description
Thread.yield();
Le thread en cours "saute son tour" et Java passe immédiatement au thread suivant.

3) wait(timeout)  – c'est une version de la méthode wait (), mais avec un timeout. "La méthode d'attente ne peut être appelée que dans un bloc synchronisé sur un objet mutex verrouillé par le thread actuel. Sinon, la méthode lève une exception MonitorState illégale.

"L'appel de cette méthode provoque la libération du verrou de l'objet mutex, le rendant disponible pour l'acquisition d'un autre thread. De plus, le thread passe à l'état WAITING (pour la méthode wait() sans paramètres) ou à l'état TIMED_WAITING (pour l'attente (timeout ) méthode)."

Exemple Description
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Lorsque la méthode d'attente est appelée, le thread actuel libère le verrou de l'objet moniteur et dort pendant 500 millisecondes. L'objet moniteur peut être acquis par un autre thread.
Après 500 millisecondes, le thread se réveillera et si le moniteur n'est pas occupé, le thread l'acquiert et continue à fonctionner.
Si le moniteur est verrouillé par un autre thread, le thread actuel passera à l'état BLOQUÉ.

4) rejoindre (délai d'attente)

"Cette méthode n'était pas dans votre question, mais elle est dans mon plan de leçon, donc je vais vous en parler. Lorsque vous appelez la méthode join() ou join(timeout), le thread actuel est "attaché" au Thread qui a appelé cette méthode. Le thread actuel se met en veille et attend que le thread auquel il est joint se termine (c'est-à-dire le thread dont la méthode join() a été appelée)."

"Le thread actuel entre dans l'état WAITING pour la méthode join() et dans l'état TIMED_WAITING pour la méthode join(timeout)."

Exemple Description
Thread thread = getWorkThread();
thread.join(500);
Le thread actuel rejoindra le thread workerThread et attendra qu'il se termine.
Mais il se "déconnectera" après 500 millisecondes et continuera à fonctionner.

"Le délai d'attente dans les méthodes wait(timeout) et join(timeout) signifie que la méthode se met en veille et attend quelque chose, mais pas plus longtemps que le délai d'attente donné en millisecondes. Ensuite, il se réveille."

"Il semble que la seule chose que ces méthodes aient en commun est le délai d'attente. Elles font des choses complètement différentes."

"Oui, c'est vrai."