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

Задачи, у которых Есть Промежуточные Результаты

Для фоновой задачи часто полезно обеспечить промежуточные результаты, в то время как это все еще работает. Задача может сделать это, вызывая SwingWorker.publish. Этот метод принимает переменное число параметров. Каждый параметр должен иметь тип, определенный SwingWorker's второй параметр типа.

Собрать результаты, обеспеченные publish, переопределение SwingWorker.process Этот метод будет вызван от события, диспетчеризируют поток. Следствия многократных вызовов publish часто накапливаются для единственного вызова process.

Давайте смотреть на путь Flipper.java использование в качестве примера publish обеспечить промежуточные результаты. Нажмите кнопку Launch, чтобы работать Flipper Сеть Java™ использования Запускается (загрузите JDK 6 или позже). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

Запускает пример Плавника

Эта программа тестирует справедливость java.util.Random генерируя серию случайных boolean значения в фоновой задаче. Это эквивалентно зеркальному отражению монеты; отсюда имя Flipper. Чтобы сообщить о ее результатах, фоновая задача использует объект типа FlipPair

private static class FlipPair {
    private final long heads, total;
    FlipPair(long heads, long total) {
        this.heads = heads;
        this.total = total;
    }
}

heads поле является числом раз, которым было случайное значение true; total поле является общим количеством случайных значений.

Фоновая задача представляется экземпляром FlipTask:

private class FlipTask extends SwingWorker<Void, FlipPair> {

Так как задача не возвращает окончательный результат, не имеет значения, каков первый параметр типа; Void используется в качестве заполнителя. Задача вызывает publish после каждого "зеркального отражения монеты":

@Override
protected Void doInBackground() {
    long heads = 0;
    long total = 0;
    Random random = new Random();
    while (!isCancelled()) {
        total++;
        if (random.nextBoolean()) {
            heads++;
        }
        publish(new FlipPair(heads, total));
    }
    return null;
}

( isCancelled метод обсуждается в следующем разделе.), Поскольку publish вызывается очень часто, много из FlipPair значения будут, вероятно, накоплены прежде process вызывается в конечном счете диспетчеризируют поток; process только интересуется последним значением, о котором сообщают каждый раз, используя это, чтобы обновить GUI:

protected void process(List<FlipPair> pairs) {
    FlipPair pair = pairs.get(pairs.size() - 1);
    headsText.setText(String.format("%d", pair.heads));
    totalText.setText(String.format("%d", pair.total));
    devText.setText(String.format("%.10g", 
            ((double) pair.heads)/((double) pair.total) - 0.5));
}

Если Random справедливо, значение, выведенное на экран в devText должен стать ближе и ближе к 0 как Flipper выполнения.


Отметьте: setText метод, используемый в Flipper "фактически ориентировано на многопотоковое исполнение" как определено в его спецификации. Это означает, что мы могли обойтись без publish и process и набор текстовые поля непосредственно от рабочего потока. Мы хотели игнорировать этот факт, чтобы обеспечить простую демонстрацию SwingWorker промежуточные результаты.

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

Предыдущая страница: Простые Фоновые задачи
Следующая страница: Отмена Фоновых задач