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 Осуждаемый?


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами