Является ли `Thread.checkAccess ()` подходящей заменой для Thread.suspend () `?

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

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

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

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

Всего 1 ответ


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

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

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

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

Я точно не знаю, что делает «приостановить» - я никогда не использовал этот метод, и его полезно определить как «Приостановить эту тему». Но если вы просто хотите подождать, пока что-то произойдет, вы можете подождать с некоторым объектом:

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

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


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

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


Есть идеи?

10000