Является ли `Thread.checkAccess ()` подходящей заменой для `Thread.suspend ()`? - PullRequest
2 голосов
/ 11 февраля 2020

IntelliJ предлагает заменить устаревшую Thread.suspend() на Thread.checkAccess(). Основанный на (очень кратких) документах , checkAccess() кажется хорошей идеей, но также выглядит совершенно иначе, чем .suspend(), что, безусловно, кажется очень плохим на основании документы . Однако эти же документы, похоже, не предлагают полезной альтернативы .suspend(), за исключением того, что предполагают, что каждое представленное решение имеет некоторые нетривиальные недостатки.

В то же время, хотя и гораздо лучше, кажется .checkAccess() полагается на то, что реализован SecurityManager, поэтому простое нажатие «исправить это» также кажется плохой идеей без какой-либо продуманной реализации.

Я внес предлагаемое изменение, и ничего не сломалось - пока ... но мне интересно ...

Если .checkAccess() - лучшая альтернатива, как лучше всего реализовать ее в двух словах? Если это не так, что является лучшей альтернативой?

1 Ответ

1 голос
/ 11 февраля 2020

Согласно документации Thread.suspend:

Сначала метод checkAccess этого потока вызывается без аргументов. Это может привести к возникновению исключения SecurityException (в текущем потоке).

Если поток жив, он приостанавливается и не продвигается дальше, пока и не будет возобновлен.

Таким образом, вызов checkAccess() сохраняет «безопасную» часть вызова suspend(), так как он вызовет исключение, если у вас нет доступа, но затем не перейдет к опасной операции взаимоблокировки.

Я точно не знаю, что делает "suspend" - я никогда не использовал этот метод, и его полезно определить как "Suspends this thread". Но если вы просто хотите подождать, пока что-то произойдет, вы можете подождать некоторый объект:

synchronized (thing) {
  thing.wait();
}

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


Но обратите внимание, что примитивные методы синхронизации на Object по своей сути сложны в использовании - например, Object.wait() может внезапно проснуться. Вы должны редко использовать их напрямую (или Thread, если на то пошло).

В пакете java.util.concurrent есть куча объектов синхронизации более высокого уровня. Например, вы можете разделить очередь между «приостановленными» и «возобновляющими» потоками, где в момент, когда вы хотите приостановить, один поток ожидает, пока другой поместит что-то в очередь.

...