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

Подробное объяснение метода wait Object в java

Метод wait класса java

Когда поток B пытается получить доступ к определенному общему ресурсу, он хочет получить объект блокировки ресурсов, но обнаруживает, что этот блок уже взят потоком A. В этот момент поток B может только быть приостановлен и ждать, пока поток A освободит блокировку.

Но поток A, который получил блокировку, в процессе выполнения, поскольку某些 условия еще не выполнены, не хочет продолжать выполнять дальше и хочет подождать немного (внимание: это поток A, который уже получил блокировку, хочет активно ждать), надеясь, что условия будут выполнены, чтобы продолжить выполнение задачи. В блоке синхронизации поток A должен сначала освободить блокировку, только тогда поток B имеет право получить блокировку, войти в блок синхронизации и выполнить код. После выполнения потока B, необходимые потоку A условия уже выполнены, в этот момент必须有 механизм уведомления, чтобы поток A перешел из состояния ожидания в состояние выполнения и продолжил выполнять код.

Некоторые студенты считают, что поток A также может постоянно циклически проверять, удовлетворяется ли условие, и не обязательно прерывать себя, чтобы ждать. Это также один из подходов, но, возможно, он требует много ресурсов CPU, и неясно, когда условие будет удовлетворено.

Для координации и общения между потоками необходимы механизмы ожидания и уведомления, в JAVA это соответствуют методам wait и notify.

Метод wait класса Object

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

Чтобы поставить поток A в состояние ожидания, можно вызвать метод wait объекта. После вызова метода wait означает: поток A уже получил блокировку, и все, что можно сделать, уже сделано, теперь он может только ждать, пока другие синхронные операции выполнят某些 код, после чего я вернусь и продолжу работать.

Внимание:

Метод wait определен в корневом классе Object, Thread наследуется от класса Object, поэтому у него также есть метод wait. Но здесь не вызывается метод wait объекта текущего потока, а метод wait объекта с свойством блокировки; это я тоже не очень понимаю, мне кажется, чтобы перейти в состояние ожидания потока A и затем быть разбудленным, можно было бы использовать методы wait и notify потока A, но, вероятно, это будет очень сложно реализовать. Кроме того, с точки зрения сценария, определение wait в Object также разумно, так как это означает, что поток hangs в池е ожидания объекта.

Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!

Скорее всего вам понравится