|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Отметьте: Это руководство по развертыванию Java описывает функции, выпущенные до Java SE 6 обновлений 10 выпусков. См. Java Богатый документ Разработки и Развертывания Интернет-приложений для последней информации.
java.security.AccessControlException Добавленный stop(), suspend(), или resume() Метод java.lang.ThreadВыполняя апплет в браузере, используя среду выполнения Java Sun (JRE), a java.security.AccessControlException добавляется stop, suspend, или resume метод java.lang.Thread class как показано в следующем коде:
java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThread)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at sun.applet.AppletSecurity.checkAccess(Unknown Source)
at java.lang.Thread.checkAccess(Unknown Source)
at java.lang.Thread.stop(Unknown Source)
at ....
Тот же самый апплет работает без любой ошибки с Microsoft Virtual Machine (VM).
Это исключение вызывается когда пользовательский вызов эти методы на мертвом Thread возразите на солнце JRE.
Java библиотеки class на солнце JRE изменился в течение долгого времени. Некоторые API были разъяснены, некоторые были осуждены, и некоторым изменили их реализацию.
Результат вызова stop, suspend, и resume на мертвом Thread объект не был четко определен. В Microsoft VM они приводят к нет. Однако, на солнце JRE, вызывая эти методы на мертвом Thread объект лишает законной силы базовое инвариантное выражение реализации, таким образом приводящей к java.security.AccessControlException.
Thread stop, suspend, и resume методы по сути опасны и были осуждены в технологии Java.
Замена призывает stop, suspend, и resume с кодом, который изменяет переменную, чтобы указать, что целевой поток должен остановить или приостановить или возобновиться.
Следующие примеры показывают, как Ваш может заменить остановку, приостановить и возобновить методы с альтернативным кодом:
Например, предположите, что Ваш апплет содержит следующие методы:
private Thread blinker;
public void start() {
blinker = new Thread(this);
blinker.start();
}
public void stop() {
blinker.stop(); // UNSAFE!
}
public void destroy() {
blinker.stop(); // UNSAFE and WILL throw java.security.AccessControlException in the Sun JRE!
}
public void run() {
Thread thisThread = Thread.currentThread();
while (true) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
Можно избежать использования blinker.stop изменяя апплет stop, destroy, и run методы как показано в следующем коде:
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public void destroy() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
Например рассмотрите апплет, который имеет mousePressed обработчик событий, который переключает состояние вызванного потока blinker как показано в следующем коде:
private boolean threadSuspended;
public void mousePressed(MouseEvent e) {
e.consume();
if (threadSuspended)
blinker.resume();
else
blinker.suspend(); // DEADLOCK-PRONE!
threadSuspended = !threadSuspended;
}
public void run()
{
while (true) {
try {
Thread.currentThread().sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
Можно избежать использования blinker.suspend и blinker.resume заменяя обработчик событий следующим кодом:
private boolean volatile threadSuspended;
public synchronized void mousePressed(MouseEvent e) {
e.consume();
threadSuspended = !threadSuspended;
if (!threadSuspended)
notify();
}
public void run() {
while (true) {
try {
Thread.currentThread().sleep(interval);
if (threadSuspended) {
synchronized(this) {
while (threadSuspended)
wait();
}
}
} catch (InterruptedException e){
}
repaint();
}
}