Почему булева переменная после while l oop все еще имеет значение true? - PullRequest
0 голосов
/ 17 апреля 2020

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

    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 () ну, во-вторых, почему через некоторое время l oop в read () , пусто - правда, почему не ложно? то же самое с write () почему через некоторое время это не так? l oop?

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Это немного странно упорядочено - например, я бы изменил 'empty' после изменения 'message', мне кажется более очевидным - но ...

Это буфер из одного сообщения.

Метод 'write' ожидает, пока 'empty', в этот момент он может установить сообщение в 'message', что делает его не пустым.

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

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

0 голосов
/ 17 апреля 2020

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

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

...