Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Не понимаю пример из книги / 3 сообщений из 3, страница 1 из 1
18.04.2020, 14:38
    #39948584
ambrazoura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю пример из книги
Здравствуйте, читаю Шилдта, главу про многопоточность, там есть пример на wait(), notify(). Хотел разобраться как они работают, а в итоге появилось ещё больше вопросов. Сам пример из книги:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
class Q {
    int n;
    boolean valueSet = false;
    
    synchronized int get() {
        while(!valueSet)
            try {
                wait();
            } catch(InterruptedException e) {
                System.out.println("Исключение типа InterruptedException перехвачено");
            }
        
        System.out.println("Получено: " + n);
        valueSet = false;
        notify();
        return n;   
    }
synchronized void put(int n) {
        while(valueSet) {
            try {
                wait();
            } catch(InterruptedException e) {
                System.out.println("Исключение типа InterruptedException перехвачено");
            }
            
            this.n = n;
            valueSet = true;
            System.out.println("Отправлено: " + n);
            notify();
        }
    }
}
class Producer implements Runnable {
    Q q;
    
    Producer(Q q) {
        this.q = q;
        new Thread(this, "Поставщик").start();
    }
    
    public void run() {
        int i = 0;
        
        while(true) {
            q.put(i++);
        }
    }
}

class Consumer implements Runnable {
    Q q;
    
    Consumer(Q q) {
        this.q = q;
        new Thread(this, "Потребитель").start();
    }
    
    public void run() {
        while(true) {
            q.get();
        }
    }
}
public class PC {
 
    public static void main(String[] args) {
    
        Q q = new Q();
        new Producer(q);
        new Consumer(q);
        
        System.out.println("Для остановки нажмите Ctrl-C.");
 
    }
 
}


Обьясните, пожалуйста, на пальцах, как это всё работает. Мы от Producer заходим в put и тут же вызываем wait. По идее поток Producer должен остановиться, судя из описания метода, но этого не происходит, почему? Из этого когда мне казалось, что оба потока так и зависнут на wait и будут ждать друг друга.
...
Рейтинг: 0 / 0
18.04.2020, 15:18
    #39948592
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю пример из книги
сам-то пример пробовал для начала запустить, ну чтобы убедиться, что там все верно? у тебя ошибка в коде, либо опечатка в книжке - в методе put цикл while должен содержать только кусок try-catch, а не весь блок
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
synchronized void put(int n) {
            while (valueSet) {
                try {
                    wait();
                }
                catch (InterruptedException e) {
                    System.out.println("Исключение типа InterruptedException перехвачено");
                }
            }
            this.n = n;
            valueSet = true;
            System.out.println("Отправлено: " + n);
            notify();

        }


тогда все правильно - т.к. valueSet == false, метод get входит в ожидание по wait, а вот put минуя wait устанавливает первое значение, и оповещает через notify get, а сам на следующей итерации переходит в свою очередь в wait, пока не получит notify от get
...
Рейтинг: 0 / 0
18.04.2020, 15:32
    #39948596
ambrazoura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не понимаю пример из книги
chpasha
сам-то пример пробовал для начала запустить, ну чтобы убедиться, что там все верно? у тебя ошибка в коде, либо опечатка в книжке - в методе put цикл while должен содержать только кусок try-catch, а не весь блок

ПК сейчас нет под рукой, поэтому не было возможности запустить код.

Теперь стало более менее ясно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Не понимаю пример из книги / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]