Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Параллелизм в Swing
Раздел: Рабочие потоки и SwingWorker
Простые Фоновые задачи
Домашняя страница > Создание GUI С JFC/Swing > Параллелизм в Swing

Простые Фоновые задачи

Давайте запустим с задачи, которая является очень простой, но потенциально отнимающей много времени. TumbleItem апплет загружает ряд графических файлов, используемых в анимации. Если графические файлы загружаются из начального потока, может быть задержка прежде, чем GUI появится. Если графические файлы загружаются из события, диспетчеризируют поток, GUI может быть временно безразличным.

Избегать этих проблем, TumbleItem создает и выполняет экземпляр SwingWorker от его начальных потоков. Объект doInBackground метод, выполняющийся в рабочем потоке, загружает изображения в ImageIcon массив, и возвраты ссылка на это. Затем done метод, выполняясь в конечном счете диспетчеризирует поток, вызывает get получать эту ссылку, которую это присваивает названному полю class апплета imgs. Это позволяет TumbleItem создать GUI сразу, не ожидая изображений, чтобы закончить загружаться.

Вот код, который определяет и выполняется SwingWorker объект.

SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
    @Override
    public ImageIcon[] doInBackground() {
        final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        for (int i = 0; i < nimgs; i++) {
            innerImgs[i] = loadImage(i+1);
        }
        return innerImgs;
    }

    @Override
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } catch (InterruptedException ignore) {}
        catch (java.util.concurrent.ExecutionException e) {
            String why = null;
            Throwable cause = e.getCause();
            if (cause != null) {
                why = cause.getMessage();
            } else {
                why = e.getMessage();
            }
            System.err.println("Error retrieving file: " + why);
        }
    }
};

Все конкретные подклассы SwingWorker реализация doInBackground; реализация done является дополнительным.

Заметьте это SwingWorker универсальный class, с двумя параметрами типа. Первый параметр типа определяет тип возврата для doInBackground, и также для get метод, который вызывается другими потоками, чтобы получить объект, возвращенный doInBackground. SwingWorker's второй параметр типа определяет тип для промежуточных результатов, возвращенных, в то время как фоновая задача является все еще активной. Так как этот пример не возвращает промежуточные результаты, Void используется в качестве заполнителя.

Можно задаться вопросом, если код, который устанавливает imgs излишне усложняется. Почему делают doInBackground возвратите объект и использование done получать это? Почему не только имеют doInBackground набор imgs непосредственно? Проблема состоит в том что объект imgs обращается к, создается в рабочем потоке и используется, в конечном счете диспетчеризируют поток. Когда объекты совместно используются потоками таким образом, следует удостовериться, что изменения, произведенные в одном потоке, видимы к другому. Используя get гарантии это, потому что использование get создает происхождение перед отношением между кодом, который создает imgs и код, который использует это. Для больше на происхождении перед отношением, обратитесь к Ошибкам Непротиворечивости Памяти в уроке Параллелизма.

Есть фактически два способа получить объект, возвращенный doInBackground.

Будьте осторожны, вызывая любую перегрузку get от события диспетчеризируют поток; до get возвраты, никакие события GUI не обрабатываются, и GUI "замораживается". Не вызывать get без параметров, если Вы не уверены, что фоновая задача полна или близко к завершению.

Для больше на TumbleItem пример, обратитесь к тому, Как Использовать Таймеры Swing в уроке, использующем Другие Функции Swing.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Рабочие потоки и SwingWorker
Следующая страница: Задачи, у которых Есть Промежуточные Результаты