powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / wait/notify
25 сообщений из 45, страница 1 из 2
wait/notify
    #38621713
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пыытаюсь разобраться с 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.
public class LeftRightWaitNotifyExample {
    final static String str = "1";

    public static void main(String[] args) throws InterruptedException {

        new LeftLegThread(str).start();
        Thread.sleep(100);
        new RightLegThread(str).start();
    }
}

class LeftLegThread extends Thread {
    String monitor;

    public LeftLegThread(String str) {
        monitor = str;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (monitor) {

            System.out.println("Left ");
            monitor.wait();
            monitor.notify();

        }
    }
}

class RightLegThread extends Thread {
    String monitor;

    public RightLegThread(String str) {
        monitor = str;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {

        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (monitor) {
            while (true) {
                System.out.println("Right ");
                monitor.notify();
                monitor.wait();
            }
        }
    }
}



вывод:
авторLeft
Right
Right

почему right дважды выводиится????

я ж только один раз нотифаю
...
Рейтинг: 0 / 0
wait/notify
    #38621726
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerпочему right дважды выводиится????

Первый раз при запуске. Второй раз по notify().
Больше логирование поставьте чтобы порядок видеть.

questionerя ж только один раз нотифаю
И что?
Рекомендую:
http://www.rsdn.ru/forum/java/2184779.flat
...
Рейтинг: 0 / 0
wait/notify
    #38621779
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Код: 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.
public class LeftRightWaitNotifyExample {
    final static String str = "1";

    public static void main(String[] args) throws InterruptedException {

        new LeftLegThread(str).start();
        Thread.sleep(100);
        new RightLegThread(str).start();
    }
}

class LeftLegThread extends Thread {
    String monitor;

    public LeftLegThread(String str) {
        monitor = str;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (monitor) {
            int i=0;
            while (i++ < 1) {
                System.out.println("Left ");
                 monitor.wait();
                 System.out.println("after wait in left");
                 monitor.notify();
                 System.out.println("after notify in left");
            }

        }
    }
}

class RightLegThread extends Thread {
    String monitor;

    public RightLegThread(String str) {
        monitor = str;
    }

    @Override
    public void run() {
        try {
            makeStep();
        } catch (InterruptedException e) {

        }
    }

    private void makeStep() throws InterruptedException {
        synchronized (monitor) {
            while (true) {
                System.out.println("Right ");
                monitor.notify();
                System.out.println("after notify in right");
                monitor.wait();
                System.out.println("after wait in right");
            }
        }
    }
}


авторLeft
Right
after notify in right
after wait in left
after notify in left
after wait in right
Right
after notify in right

1. левый поток захватывает секцию, выводит left выполняет wait, освобождает секцию для другого потока
2. правый поток захватывает секцию выводит right нотифаит левый поток выполняет wait, освобождает секцию для другого потока
3. левый поток захватывает секцию и делает нотифай, покидает секцию
4. правый поток будится после wait, выводит Right нотифаит, уходит в wait и всё виснет.


Что-то я запутался в разнице между wait и notify
...
Рейтинг: 0 / 0
wait/notify
    #38621783
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

notify запускает того, кто wait
...
Рейтинг: 0 / 0
wait/notify
    #38621787
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в данном случае монитор не у каждого потока свой, а должен быть общий монитор, между потоками.
...
Рейтинг: 0 / 0
wait/notify
    #38621791
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanИ в данном случае монитор не у каждого потока свой, а должен быть общий монитор, между потоками.
Он общий. Просто код кривой из-за этого не очевидно.
...
Рейтинг: 0 / 0
wait/notify
    #38621795
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЧто-то я запутался в разнице между wait и notify
Что конкретно не понятно? Запутался, но вопросов не имею?
...
Рейтинг: 0 / 0
wait/notify
    #38621811
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Код: java
1.
2.
monitor.notify();
     monitor.wait();



я делаю notify и wait.

ожидающий поток разбудится только после исполнения строчки monitor.wait(); ?

когда я делаю wait, то этот поток останавливается на этой строчке, отпускает монитор секции и ждёт пока ему сделают нотифай?
...
Рейтинг: 0 / 0
wait/notify
    #38621830
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerожидающий поток разбудится только после исполнения строчки monitor.wait(); ?

Конечно. Ведь мониор захвачен текущим потоком и второй поток никак не может исполнять synchronized секцию, пока текущий поток не отпустит монитор.
notify() говорит спящему потоку проснуться. Тот "просыпается", но не может приступить к выполнению, так как монитор захвачен.
wait() освобождает монитор и проснувшийся поток может его захватить чтобы продолжить исполнение кода.

questionerкогда я делаю wait, то этот поток останавливается на этой строчке, отпускает монитор секции и ждёт пока ему сделают нотифай?
Да.
...
Рейтинг: 0 / 0
wait/notify
    #38621846
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

спасибо
...
Рейтинг: 0 / 0
wait/notify
    #38621875
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

а насчёт кривизны кода. тут естественно надо сначала нотифаить, а потом wait.

А как бы передавали монитор?

явно обращались бы LeftRightWaitNotifyExample.str ?
...
Рейтинг: 0 / 0
wait/notify
    #38621888
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и ещё слышал что-то, что wait надо как-то в цикле вызывать потому, что какая-то бага в jvm....

или я что-то путаю?
...
Рейтинг: 0 / 0
wait/notify
    #38621905
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerи ещё слышал что-то, что wait надо как-то в цикле вызывать потому, что какая-то бага в jvm....
И notify тоже в цикле дергать, чтоб wait уж точно-точно сработал?

questionerили я что-то путаю?
Да.
...
Рейтинг: 0 / 0
wait/notify
    #38621921
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
wait/notify
    #38621930
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, там совсем не JVM и её баги рассматриваются, а обычные ситуации, когда wait отработает.

авторThis method causes the current thread (call it T) to place itself in the wait set for this object and then to relinquish any and all synchronization claims on this object. Thread T becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:

Some other thread invokes the notify method for this object and thread T happens to be arbitrarily chosen as the thread to be awakened.

Some other thread invokes the notifyAll method for this object.

Some other thread interrupts thread T.

The specified amount of real time has elapsed, more or less. If timeout is zero, however, then real time is not taken into consideration and the thread simply waits until notified.


И для последних двух случаев предлагают решение в виде цикла, который будет проверять внутренний флаг .
...
Рейтинг: 0 / 0
wait/notify
    #38621957
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

как в моем случае сделать этот флаг?
...
Рейтинг: 0 / 0
wait/notify
    #38621961
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
wait/notify
    #38622024
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, солбщение почти пятилетней давности...
Флаг - булевская переменная, которую выставлять перед своими действиями, чтобы отличать их от перечисленных системных событий, указанных выше.
...
Рейтинг: 0 / 0
wait/notify
    #38622048
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

я не понимаю как в моем случае этот флаг поставить.

Помогите пожалуйста.
...
Рейтинг: 0 / 0
wait/notify
    #38622069
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerкак в моем случае сделать этот флаг?
Ну, например, хранить состояние какой ногой сейчас "шагать".
...
Рейтинг: 0 / 0
wait/notify
    #38622070
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanquestioner, солбщение почти пятилетней давности...
Флаг - булевская переменная, которую выставлять перед своими действиями, чтобы отличать их от перечисленных системных событий, указанных выше.
там кроме spurious wakeup остальные не актуальны для тестового примера. Но вот в реальной жизни, действительно, стоит обезопасить действие проверкой состояния. Нельзя неявно хранить состояние бизнес логики в состоянии потока.
...
Рейтинг: 0 / 0
wait/notify
    #38622074
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

то есть самый простой вариант создать какую-то третью сущность, доступ к которой будут иметь оба потока, засинхронизироваться по ней и менять ее состояние?
...
Рейтинг: 0 / 0
wait/notify
    #38622075
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа насчёт кривизны кода. тут естественно надо сначала нотифаить, а потом wait.
А как бы передавали монитор?
явно обращались бы LeftRightWaitNotifyExample.str ?
Да, тут вагон и меленькая тележка вопросов к коду.
- Почему для одного монитора целых 3 поля?
- Почему левая и правая нога - разные классы. У низ разная структура? Или разное поведение?
- Почему одно поле final, а остальные - нет? На сколько это безопасно?
- Гарантирует ли Thread.sleep() ожидаемое поведение?
...
Рейтинг: 0 / 0
wait/notify
    #38622079
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДа, тут вагон и меленькая тележка вопросов к коду.
- Почему для одного монитора целых 3 поля?
- Почему левая и правая нога - разные классы. У низ разная структура? Или разное поведение?
- Почему одно поле final, а остальные - нет? На сколько это безопасно?
- Гарантирует ли Thread.sleep() ожидаемое поведение?
И, ещё. вопрос - на сколько безопасно синхронизироваться на строковых константах и других публично доступных экземплярах?
...
Рейтинг: 0 / 0
wait/notify
    #38622081
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerто есть самый простой вариант создать какую-то третью сущность, доступ к которой будут иметь оба потока, засинхронизироваться по ней и менять ее состояние?

Код: java
1.
2.
private static final Object LOCK = new Object();
private boolean stepRight;
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / wait/notify
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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