Что происходит с потоком, который не может получить семафор? - PullRequest
5 голосов
/ 21 октября 2010

Что происходит, когда поток не может получить семафор (из-за отсутствия разрешения).Будет ли он переведен в состояние ожидания?

РЕДАКТИРОВАТЬ: возобновит ли поток возобновление предыдущей последовательности выполнения, когда семафор станет доступен.

1 Ответ

5 голосов
/ 21 октября 2010

Что происходит, когда поток не может получить семафор (из-за отсутствия разрешения). Будет ли он переведен в состояние ожидания?

Да. Если вы говорите о java.util.concurrent.Semaphore метод aquire , вот что происходит:

Получает разрешение от этого семафора, блокируя до тех пор, пока оно не станет доступным, или пока поток не прервется.

[...]

Если разрешение недоступно, текущий поток отключается для целей планирования потоков и остается неактивным, пока не произойдет одно из двух:

  • Какой-то другой поток вызывает метод release () для этого семафора, и текущему потоку затем будет назначено разрешение; или

  • Какой-то другой поток прерывает текущий поток.

tryAquire однако, как следует из названия, будет пытаться захватить блокировку, и вместо блокировки вернуть false, если у нее нет разрешения.

Будет ли начало потока возобновлять предыдущую последовательность выполнения, когда семафор станет доступным.

Да. Если другой поток вызывает release, этот поток может вернуться из acquire и продолжить выполнение.

...