Spec-Zone .ru
спецификации, руководства, описания, API
|
java.security.AccessControlException
Добавленный stop()
, suspend()
, или resume()
Метод java.lang.Thread
Выполняя апплет в браузере, используя среду выполнения Java Sun (JRE), a java.security.AccessControlException
добавляется stop
, suspend
, или resume
метод java.lang.Thread
класс как показано в следующем коде:
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 на солнце 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(); } }
Thread.stop
, Thread.suspend
, Thread.resume
, и Runtime.runFinalizersOnExit
Осуждаемый?