что происходит, когда поток прерывается во время блокировки в wait ()? - PullRequest
5 голосов
/ 10 ноября 2011

Учитывая тот факт, что wait () может вызываться только в синхронизированном контексте, который впоследствии освобождает монитор до тех пор, пока другой поток не вызовет notify / nofityAll для того же объекта,

Предположим, что поток A блокируетв ожидании (), в результате которого поток B получает блокировку.Теперь, если мы прервем поток A, будет ли управление немедленно передано потоку A?в этом случае, поскольку блок try catch, обрабатывающий InterrupException, находится в синхронизированном контексте, и поскольку только один поток может одновременно держать монитор, что будет с потоком B?должен ли он перейти в заблокированное состояние, пока поток А не завершит выполнение?

Заранее спасибо

Ответы [ 2 ]

8 голосов
/ 10 ноября 2011

Чтение документации действительно помогает:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

Таким образом, когда поток прерывается, он должен повторно получить монитор объекта, чтобы восстановить состояние синхронизации, прежде чем будет сгенерировано исключение. То же самое относится и к возврату из ожидания (длинного) вызова по истечении указанного промежутка времени.

Поток T затем удаляется из набора ожидания для этого объекта и повторно включен для планирования потока. Затем он конкурирует в обычном порядке с другими потоками на право синхронизации на объекте; однажды это получил контроль над объектом, все его претензии по синхронизации на объект восстанавливается до статус-кво, то есть до Ситуация на момент вызова метода ожидания. Нить Т затем возвращается из вызова метода ожидания. Таким образом, по возвращении из метода ожидания, состояние синхронизации объекта и поток Т точно такой же, каким был при вызове метода ожидания.

Если текущий поток прерывается другим потоком, пока он ожидание, затем генерируется InterruptedException. Это исключение не выбрасывается, пока статус блокировки этого объекта не будет восстановлен как описано выше.

2 голосов
/ 10 ноября 2011

Я полагаю, что A станет работоспособным, но подождет, пока не получит блокировку, прежде чем приступить к предложению catch.Это не заставит В в заблокированное состояние.Весь смысл синхронизированного блока состоит в том, что потоку, удерживающему блокировку, гарантируется, что никакой другой поток не сможет синхронизироваться с той же блокировкой, пока он не снимет свою блокировку;приведение B в заблокированное состояние и разрешение А вновь получить блокировку нарушит саму суть синхронизации.

...