English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Метод 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 в池е ожидания объекта.
Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!