notify() -> все потоки в ожидании должны завершиться

Согласно 17.2.4. Взаимодействие ожиданий, уведомлений и прерываний:

Точно так же уведомления не могут быть потеряны из-за прерываний. Предположим, что набор потоков s находится в наборе ожидания объекта m, а другой поток выполняет уведомление о m. Тогда либо:

а) по крайней мере один поток в s должен нормально вернуться из ожидания или

б) все потоки в s должны выйти из ожидания, бросив InterruptedException

Это меня удивляет, потому что я знаю, что notify() только пробуждает один поток, поэтому b) не может произойти. Вариант b) кажется мне совершенно бессмысленным, потому что помимо того, что notify() ведет себя как notifyAll(), он также должен прерывать все ожидающие потоки.

Вопрос: этот абзац неверен? Если нет, то почему?


person adrhc    schedule 27.12.2018    source источник


Ответы (1)


все потоки в s должны выйти из ожидания, бросив InterruptedException

Это означает, что все потоки, ожидающие s, были прерваны.

б) означает, что если все потоки прерваны, ни один поток не будет нормально просыпаться из wait() из-за того, что он был прерван.

person Peter Lawrey    schedule 27.12.2018
comment
Спасибо, а откуда вы делаете вывод, что речь идет о ситуации, когда все потоки прерываются? - person adrhc; 27.12.2018
comment
Хотя я проголосовал за ваш ответ, потому что в нем есть некоторая логика, я все еще не уверен, что он правильный. Я имею в виду, что мы находимся в контексте другой поток выполняет уведомление о m, и вы утверждаете, что в одно и то же время должно произойти прерывание во всех потоках только для того, чтобы b) было объяснимо. - person adrhc; 05.03.2019