Spec-Zone .ru
спецификации, руководства, описания, API

AWT Распараллеливающие Проблемы

Слушатели и потоки

Если не указано иное, все слушатели AWT уведомляются относительно события, диспетчеризируют поток. Безопасно удалить/добавить слушателей из любого потока во время диспетчеризации, но изменения только эффект последующее уведомление.
Например, если ключевые слушатели добавляются от другого ключевого слушателя, недавно добавленный слушатель только уведомляется относительно последующих ключевых событий.

Автозавершение работы

Согласно Спецификации Виртуальной машины Java™, разделы 2.17.9 и 2.19, виртуальная машина Java (JVM) первоначально запускает с единственным потоком недемона, который обычно вызывает main метод некоторого класса. Виртуальная машина завершает все свое действие и выходит, когда одна из двух вещей происходит:

Это подразумевает, что, если приложение не запускает никакой, распараллеливает себя, JVM выйдет как только main завершается. Дело обстоит не так, однако, для простого приложения, которое создает и выводит на экран a java.awt.Frame:

        public static void main(String[] args) {
            Frame frame = new Frame();
            frame.setVisible(true);
         }
Причина состоит в том, что AWT инкапсулирует асинхронное событие, диспетчеризируют машину, чтобы обработать события AWT, или компоненты Swing могут стрелять. Точное поведение этой машины является зависящим от реализации. В частности это может запустить потоки помощника недемона в своих внутренних целях. Фактически, они - потоки, которые предотвращают пример выше от выхода. Единственные ограничения, введенные для поведения этой машины, следующие: Импликации третьего ограничения следующие: Это зависит от реализации, если и когда потоки помощника недемона завершаются, как только все компоненты делаются невизуализуемыми. Специфичные для реализации детали даются ниже.

Зависящее от реализации поведение.

До 1.4, никогда не завершались потоки помощника.

Запускаясь с 1.4, поведение изменилось в результате фиксации для 4030718. С текущей реализацией AWT завершает все свои потоки помощника, позволяющие приложение выходить чисто, когда следующие три условия являются истиной:

Поэтому, автономное приложение AWT, которое хочет выйти чисто без вызова System.exit должен: Отметьте, что, в то время как приложение после этих рекомендаций выйдет чисто под нормальными условиями, не гарантируется, что это выйдет чисто во всех случаях. Два примера: С другой стороны, если Вы требуете, чтобы JVM продолжала работать даже после того, как приложение сделало все компоненты невизуализуемыми, следует запустить поток недемона, который блокирует навсегда.
        <...>
        Runnable r = new Runnable() {
            public void run() {
                Object o = new Object();
                try {
                    synchronized (o) {
                        o.wait();
                    }
                } catch (InterruptedException ie) {
                }
            }
        };
        Thread t = new Thread(r);
        t.setDaemon(false);
        t.start();
        <...>
Спецификация Виртуальной машины Java™ гарантирует, что JVM не выходит, пока этот поток не завершается.