English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introduction détaillée de la méthode wait de l'objet java

Méthode wait de l'objet java

Lorsque le thread B accède à une ressource partagée, il souhaite obtenir l'objet verrou de la ressource, mais découvre que ce verrou a été pris par le thread A. Dans ce cas, le thread B ne peut qu'être mis en suspens, en attendant que le thread A libère le verrou.

Mais le thread A qui a obtenu le verrou pendant l'exécution, en raison de certaines conditions qui ne sont pas encore satisfaites, ne veut pas continuer à s'exécuter et souhaite d'abord attendre un peu (attention : c'est le thread A qui a déjà obtenu le verrou qui souhaite attendre activement), en espérant que certaines conditions soient satisfaites pour continuer à exécuter la tâche. Dans le bloc de code synchronisé, le thread A doit d'abord libérer le verrou, le thread B ayant ainsi la qualification pour obtenir le verrou, entrer dans le bloc de code synchronisé et exécuter le code. Une fois que le thread B a terminé son exécution, les conditions nécessaires au thread A sont satisfaites, alors il est nécessaire d'avoir un mécanisme de notification pour faire passer le thread A de l'état d'attente à l'état d'exécution, et continuer à exécuter le code.

Certains étudiants pensent que le thread A peut également continuer à itérer et vérifier si la condition est satisfaite, sans nécessairement interrompre lui-même, puis attendre. En réalité, c'est aussi une idée, mais ? Cela consomme beaucoup de CPU et on ne sait pas quand la condition sera satisfaite.

Pour que les threads communiquent et collaborent, il doit y avoir un mécanisme d'attente et un mécanisme de notification, en JAVA, cela correspond aux méthodes wait et notify.

Méthode wait de l'Object

synchronized (obj) {
    while (condition does not ok){
      obj.wait();
    }
 }

Pour que le thread A soit en état d'attente, vous pouvez appeler la méthode wait de l'objet courant. Une fois que la méthode wait est appelée, cela signifie que : le thread A a obtenu le verrou, et tout ce qu'il peut faire a été fait, maintenant il ne peut qu'attendre, en attendant que d'autres opérations synchronisées exécutent certains codes, après quoi je reviendrai pour continuer à travailler.

Attention :

La méthode wait est définie sur la classe racine Object, Thread hérite de la classe Object, donc il a naturellement aussi la méthode wait. Mais ici, ce n'est pas la méthode wait de l'objet courant qui est appelée, mais la méthode wait de l'objet courant avec des attributs de verrou ; je ne comprends pas trop cela, je pense que pour que le thread A passe à l'état d'attente et soit réveillé plus tard, même si l'on utilise la méthode wait et notify du thread A, cela est possible, mais cela semble très difficile à réaliser. D'autre part, du point de vue de la scène, définir wait sur Object semble aussi raisonnable, ce qui signifie que le thread est coincé dans le pool d'attente de l'objet.

Merci de lire, j'espère que cela pourra aider tout le monde, merci de votre soutien à ce site !

Vous pourriez aussi aimer