Почему логическая переменная после цикла While по-прежнему верна?

У меня проблема с пониманием этих методов, а также переменной empty:

    private String message;
    private boolean empty = true;

    public synchronized String read() {

        while (empty) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }

        empty = true; // i mean this line

        notifyAll();
        return message;
    }

    public synchronized void write(String message) {

        while (!empty) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }

        empty = false; // and this line

        this.message = message;
        notifyAll();
    }

Во-первых, я не мог понять wait() и notifyAll(), а во-вторых, почему после цикла while в read() значение empty равно true , а почему не ложь? то же самое с write(), почему не true после цикла while?

Извините, если мой язык плохой, я не носитель языка. заранее спасибо


person Abdelillah    schedule 16.04.2020    source источник
comment
Представьте, если бы empty было переименовано в messageConsumed. Это делает его более ясным?   -  person VGR    schedule 17.04.2020
comment
@VGR еще нет, почему после блока цикла while это все еще верно в write ()?   -  person Abdelillah    schedule 17.04.2020
comment
Потому что метод write должен ждать, пока сообщение будет прочитано. После прочтения логическое поле устанавливается в false, чтобы указать, что новое сообщение доступно для чтения.   -  person VGR    schedule 17.04.2020


Ответы (2)


Это немного странно упорядочено - например, я бы изменил «пусто» после изменения «сообщения», мне это кажется более очевидным, но...

Это буфер на одно сообщение.

Метод «запись» ждет, пока «пусто», после чего он может установить сообщение в «сообщение», сделав его не пустым.

Метод «чтение» ждет, пока «не станет пустым», после чего он может использовать сообщение из «сообщения», снова делая его пустым.

На мой вкус переменная 'пусто' лишняя. Я бы основывал его на нулевом/ненулевом состоянии «сообщения» (при условии, что никогда не бывает случаев записи нулевого значения в качестве сообщения).

person user13306412    schedule 16.04.2020

read вызывает wait до тех пор, пока empty истинно: это означает, что читать нечего. Как только empty становится ложным, read устанавливает empty в true (это означает, что он читает все, что нужно прочитать), уведомляет все ожидающие потоки и возвращается.

write делает прямо противоположное.

person Burak Serdar    schedule 16.04.2020