вызов Thread.sleep () из синхронизированного контекста в Java

Я прочитал, что Thread.sleep() приостановит текущий выполняющийся поток на указанное время, после чего он вернется в рабочее состояние, ожидая своей очереди для запуска.

Кроме того, если вызывается из synchronized контекста, sleep() не снимает удерживаемую блокировку. Поэтому мне было интересно, когда он освободит блокировку. Если поток, переведенный в спящий режим, никогда не получит возможности запустить, он всегда будет держать блокировку при себе, а затем о том, как другие потоки могут войти в синхронизированные методы / блок.

Я не уверен, что задаю правильный вопрос. Но, пожалуйста, помогите мне.


person Anand    schedule 19.05.2012    source источник


Ответы (2)


Поэтому мне было интересно, когда он освободит блокировку.

Он снимет блокировку при выходе из блока synchronized, но не ранее.

Если поток, переведенный в спящий режим, никогда не получит возможности запустить, он всегда будет держать блокировку при себе, а затем о том, как другие потоки могут войти в синхронизированные методы / блок.

Проще говоря, другие потоки не смогут ввести код, который синхронизируется на том же объекте, что и спящий поток.

Подводя итог, вызов Thread.sleep() из блока synchronized, вероятно, не лучшая идея.

person NPE    schedule 19.05.2012
comment
На самом деле, звонить Thread.sleep(), скорее всего, совсем не лучшая идея. Если есть что-то, что вы можете сделать сейчас, сделайте это сейчас. Если вам нужно чего-то подождать, прежде чем вы сможете что-то сделать, вам следует дождаться этого, а не спать. - person David Schwartz; 19.05.2012
comment
@DavidSchwartz: Согласен. Хотя Thread.sleep() имеет законное использование, он часто используется там, где его не должно быть. - person NPE; 19.05.2012
comment
Хорошо объяснено, но вкратце говоря, вызов Thread.sleep () из синхронизированного блока, вероятно, не является хорошей идеей. заходит слишком далеко. Иногда хочется подождать и оставить замок. - person Jesus; 09.10.2015
comment
@DavidSchwartz, что ты имеешь в виду, ты должен ждать этого чего-то, а не спать? - person StackUser; 08.02.2016
comment
@UtenteStack Если вы ждете, пока зазвонит телефон, подождите, пока зазвонит телефон. Вы не должны ложиться спать в течение 4 секунд, а затем проверьте, звонил ли телефон, пока вы спали. Если есть что-то, чего вы ждете, вам следует дождаться этого, а не спать. - person David Schwartz; 08.02.2016
comment
Приведу пример: мне нужно отбирать твиты с помощью TwitterStream. Этот API имеет ограничение на количество звонков за 15 минут. Итак, я вынужден использовать Thread.sleep () от одного вызова к другому ... как мне поступить иначе? - person StackUser; 08.02.2016
comment
Код, разрешающий вызовы API, должен использовать таймер для запуска вызова notify. Код, который выполняет вызовы API, должен ожидать разрешения с использованием wait. Даже если вы объедините эти две функции в один фрагмент кода, операция будет запущена таймером, поэтому нет необходимости вызывать sleep. Вместо того, чтобы заставлять поток ждать, пока что-то произойдет, чтобы он мог работать, пусть это происходит, чтобы работа была сделана, чтобы ничего не нужно было ждать. - person David Schwartz; 09.02.2016

Если вы используете Object.wait вместо Thread.sleep, блокировка синхронизированного блока будет снята.

person nosid    schedule 19.05.2012