Согласно документации Thread.suspend
:
Сначала метод checkAccess этого потока вызывается без аргументов. Это может привести к возникновению исключения SecurityException (в текущем потоке).
Если поток жив, он приостанавливается и не продвигается дальше, пока и не будет возобновлен.
Таким образом, вызов checkAccess()
сохраняет «безопасную» часть вызова suspend()
, так как он вызовет исключение, если у вас нет доступа, но затем не перейдет к опасной операции взаимоблокировки.
Я точно не знаю, что делает "suspend" - я никогда не использовал этот метод, и его полезно определить как "Suspends this thread". Но если вы просто хотите подождать, пока что-то произойдет, вы можете подождать некоторый объект:
synchronized (thing) {
thing.wait();
}
, а затем вызвать thing.notify()
из потока, который вы в противном случае использовали бы для возобновления потока.
Но обратите внимание, что примитивные методы синхронизации на Object
по своей сути сложны в использовании - например, Object.wait()
может внезапно проснуться. Вы должны редко использовать их напрямую (или Thread
, если на то пошло).
В пакете java.util.concurrent
есть куча объектов синхронизации более высокого уровня. Например, вы можете разделить очередь между «приостановленными» и «возобновляющими» потоками, где в момент, когда вы хотите приостановить, один поток ожидает, пока другой поместит что-то в очередь.