![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Что конкретно делает wait()? Он приостанавливает поток по отношению к тому объекту, чей у него монитор или вообще? То есть, по отношению к чему нужно вызывать wait? Если просто вызвать wait, то он, как я понимаю, вызовется по отношению к тому экземпляру, в котором он вызван. То есть, конструкция
в общем случае неправильна, потому что вызывает wait по отношению к this, а не к a? |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: нет Всего: 20 |
wait() приостанавливает текущий поток и делает доступной эту критическую секцию другим потокам, а Thread.sleep() приостанавливает текущий поток и при этом так же лочит текущую крит. секцию
Добавлено через 7 минут и 15 секунд кста, вот статья неплохая по многопоточности Это сообщение отредактировал(а) W0LF - 18.12.2007, 20:52 -------------------- iOS developer |
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
||||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
А что делает wait по отношению к объекту-подтипу Thread? Оно как-то реагирует на то, стоит поток или нет?
|
|||
|
||||
| COVD |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
терминология у вас какая-то, "научная", что-ли
Это сообщение отредактировал(а) COVD - 19.12.2007, 00:24 |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
||||
|
||||
| COVD |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
я не пробовал Добавлено через 12 минут и 13 секунд
я просто с первой попытки не понял.
В смысле, Оно - это wait? Т.е. играет ли роль тип обьекта на котором вызывается wait()? Нет. Это должен быть инстанс Object. На нем ставится флаг, т.е. некоторая переменная устанавливается в true. Все обьекты эту переменную имеют. И она используется потоками которые к этому обьекту имеют доступ. Это сообщение отредактировал(а) COVD - 19.12.2007, 00:33 |
||||||
|
|||||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Мне кажется, я где-то видел, что при помощи wait по отношению к потоку ждали то ли его завершения, то ли приостановки. Естественно, понятно, что будучи наследником Object-а, он наследует его свойства. А вот ещё вопрос: чем отличается notifyAll? Насколько я понимаю, если потоки стоят в режиме ожидания, то даже если их толкнуть все, то задвигается всё равно только один, ведь монитор может получить только один. |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: нет Всего: 20 |
то, что в этом блоке
называется критической секцией Добавлено через 1 минуту и 51 секунду абсолютно верно, но не совсем все, а которые держит текущий объект-монитор. только какой из них первым будет - неизвестно -------------------- iOS developer |
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
||||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
если несколько потоков стоят в wait(), то notifyAll их всех выведет из режима ожидания. И дальше они по-очереди будут выполнять код после wait(), как в обычном синхронизированном блоке. |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: нет Всего: 20 |
Ок, неправильно выразился - а Thread.sleep() приостанавливает текущий поток и при этом не отпускает текущую крит. секцию -------------------- iOS developer |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Но ведь они не могут по-очереди выполнять код! Они все претендуют на один и тот же монитор, следовательно, только кто-то один из них его получит. То есть, работать будет только один, до тех пор, пока он не освободит монитор. Или, имеется в виду, что когда сделан одиночный notify, то в этом случае какой-то один из потоков проснётся, а остальные будут в режиме ожидания даже в том случае, если монитор будет свободен? То есть, они будут ждать сигнала notify даже при свободном мониторе. Кажется, проясняется. Получается, что фича, по которой в ответ на notify оживает один случайный поток, есть баг? Иными словами, если у меня такое в программе случилось, то, скорее всего, я ошибся. Я, скорее всего, должен был так запрограммировать, чтобы ждал у меня один конкретный поток, который я и имел в виду оживить по notify. |
|||
|
||||
| COVD |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
По идее, так.
Ну, это не совсем баг, потому что разработчики java вроде предупреждают в документации, что они не гарантируют того, что "первый заснул-первый проснулся". Есть еще один "баг" под названием "spurious wakeup". т.е. поток самопроизвольно выходит из wait безо всякого notify. По этой причине wait принято ставить в цикл while, который в случае фальшивого пробуждения возвращает поток обратно в wait. Это тоже описано в документации здесь :
Это сообщение отредактировал(а) COVD - 20.12.2007, 17:57 |
||||||
|
|||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |