powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Не понимаю пример из книги
3 сообщений из 3, страница 1 из 1
Не понимаю пример из книги
    #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
Не понимаю пример из книги
    #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
Не понимаю пример из книги
    #39948596
ambrazoura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha
сам-то пример пробовал для начала запустить, ну чтобы убедиться, что там все верно? у тебя ошибка в коде, либо опечатка в книжке - в методе put цикл while должен содержать только кусок try-catch, а не весь блок

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

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


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