Spec-Zone .ru
спецификации, руководства, описания, API
|
Для фоновой задачи часто полезно обеспечить промежуточные результаты, в то время как это все еще работает. Задача может сделать это, вызывая SwingWorker.publish
. Этот метод принимает переменное число параметров. Каждый параметр должен иметь тип, определенный SwingWorker
's второй параметр типа.
Собрать результаты, обеспеченные publish
, переопределение SwingWorker.process
publish
часто накапливаются для единственного вызова process
.
Давайте смотреть на путь
использование в качестве примера Flipper.java
publish
обеспечить промежуточные результаты. Нажмите кнопку Launch, чтобы работать Flipper
Сеть Java™
Эта программа тестирует справедливость 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
промежуточные результаты.