Что происходит, когда поток не может получить семафор (из-за отсутствия разрешения). Будет ли он переведен в состояние ожидания?
Да. Если вы говорите о java.util.concurrent.Semaphore
(и метод aquire
, вот что происходит:
Получает разрешение от этого семафора, блокируя до тех пор, пока оно не станет доступным, или пока поток не прервется.
[...]
Если разрешение недоступно, текущий поток отключается для целей планирования потоков и остается неактивным, пока не произойдет одно из двух:
Какой-то другой поток вызывает метод release () для этого семафора, и текущему потоку затем будет назначено разрешение; или
Какой-то другой поток прерывает текущий поток.
tryAquire
однако, как следует из названия, будет пытаться захватить блокировку, и вместо блокировки вернуть false, если у нее нет разрешения.
Будет ли начало потока возобновлять предыдущую последовательность выполнения, когда семафор станет доступным.
Да. Если другой поток вызывает release
, этот поток может вернуться из acquire
и продолжить выполнение.