Spec-Zone.ru › OpenJDK 24

Класс SwingWorker<T,V>

java.lang.Object
javax.swing.SwingWorker<T,V>
Параметры типа:
T - тип результата, возвращаемый этим SwingWorker's doInBackground и get методами
V - тип, используемый для передачи промежуточных результатов этим SwingWorker's publish и process методами
Все реализованные интерфейсы:
Runnable, Future<T>, RunnableFuture<T>
public abstract class SwingWorker<T,V> extends Object implements RunnableFuture<T>
Абстрактный класс для выполнения длительных задач взаимодействия с графическим интерфейсом пользователя (GUI) в фоновом потоке. Для выполнения таких задач могут использоваться несколько фоновых потоков. Однако точная стратегия выбора потока для любой конкретной SwingWorker не определена и на ней не следует полагаться.

При разработке многопоточного приложения Swing следует учитывать два ограничения: (см. Многопоточность в Swing для получения более подробной информации):

  • Занимающие много времени задачи не должны выполняться в потоке обработки событий (Event Dispatch Thread). В противном случае приложение перестанет реагировать.
  • Компоненты Swing должны обращаться только к потоку обработки событий (Event Dispatch Thread).

Эти ограничения означают, что приложение GUI с интенсивными вычислениями должно иметь как минимум два потока: 1) поток для выполнения длительной задачи и 2) поток обработки событий (EDT) для всех задач, связанных с GUI. Это предполагает межпоточное взаимодействие, которое может быть сложным для реализации.

SwingWorker предназначен для ситуаций, когда требуется длительная задача, выполняемая в фоновом потоке, и предоставление обновлений интерфейсу пользователя как при завершении, так и во время обработки. Подклассы SwingWorker должны реализовывать метод doInBackground() для выполнения вычислений в фоновом режиме.

Поток выполнения

В жизненном цикле SwingWorker участвуют три потока:

  • Текущий поток: Метод execute() вызывается в этом потоке. Он планирует SwingWorker для выполнения в рабочем потоке и сразу же возвращается. Можно дождаться завершения SwingWorker, используя методы get.

  • Рабочий поток: Метод doInBackground() вызывается в этом потоке. Здесь должны выполняться все задачи во фоновом режиме. Для уведомления PropertyChangeListeners об изменениях связанных свойств используйте методы firePropertyChange и getPropertyChangeSupport(). По умолчанию доступны два связанных свойства: state и progress.

  • Поток обработки событий: Все операции, связанные с Swing, происходят в этом потоке. SwingWorker вызывает методы process и done() и уведомляет всех слушателей в этом потоке.

Часто, Текущий поток является Потоком обработки событий.

Прежде чем метод doInBackground вызывается в рабочем потоке, SwingWorker уведомляет всех слушателей об изменении свойства state на StateValue.STARTED. После завершения метода doInBackground выполняется метод done. Затем SwingWorker уведомляет всех слушателей об изменении свойства state на StateValue.DONE.

SwingWorker предназначен для выполнения только один раз. Выполнение SwingWorker более одного раза не приведет к вызову метода doInBackground дважды.

Пример использования

Следующий пример иллюстрирует самый простой случай использования. Некоторые вычисления выполняются в фоновом режиме, а по завершении вы обновляете компонент Swing.

Предположим, мы хотим найти «Смысл жизни» и отобразить результат в JLabel.

   final JLabel label;
   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
       @Override
       public String doInBackground() {
           return findTheMeaningOfLife();
       }

       @Override
       protected void done() {
           try {
               label.setText(get());
           } catch (Exception ignore) {
           }
       }
   }

   (new MeaningOfLifeFinder()).execute();
 

Следующий пример полезен в ситуациях, когда вы хотите обрабатывать данные по мере их готовности в Потоке обработки событий.

Теперь мы хотим найти первые N простых чисел и отобразить результаты в JTextArea. Пока это вычисляется, мы хотим обновлять наш прогресс в JProgressBar. Наконец, мы также хотим вывести простые числа в System.out.

 class PrimeNumbersTask extends
         SwingWorker<List<Integer>, Integer> {
     PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
         //initialize
     }

     @Override
     public List<Integer> doInBackground() {
         while (! enough && ! isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }

     @Override
     protected void process(List<Integer> chunks) {
         for (int number : chunks) {
             textArea.append(number + "\n");
         }
     }
 }

 JTextArea textArea = new JTextArea();
 final JProgressBar progressBar = new JProgressBar(0, 100);
 PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
 task.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer)evt.getNewValue());
             }
         }
     });

 task.execute();
 System.out.println(task.get()); //prints all prime numbers we have got
 

Поскольку SwingWorker реализует Runnable, SwingWorker может быть передан в Executor для выполнения.

С:
1.6

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static enum  SwingWorker.StateValue
Значения для связанного свойства state.

Вложенные классы/интерфейсы, объявленные в интерфейсе java.util.concurrent.Future

Future.State

Краткое описание конструкторов

Конструктор Описание
SwingWorker()
Создает этот SwingWorker.

Краткое описание методов

Модификатор и тип Метод Описание
final void addPropertyChangeListener(PropertyChangeListener listener)
Добавляет слушателя в список слушателей.
final boolean cancel(boolean mayInterruptIfRunning)
Попытка отменить выполнение этой задачи.
protected abstract T doInBackground()
Вычисляет результат или бросает исключение, если это невозможно сделать.
protected void done()
Выполняется в Потоке обработки событий после завершения метода doInBackground.
final void execute()
Планирует выполнение этой SwingWorker в рабочем потоке.
final void firePropertyChange(String propertyName, Object oldValue, Object newValue)
Сообщает об обновлении связанного свойства всем зарегистрированным слушателям.
final T get()
Ожидает завершения вычислений и возвращает результат.
final T get(long timeout, TimeUnit unit)
Ожидает завершения вычислений не более чем в течение заданного времени и возвращает результат, если он доступен.
final int getProgress()
Возвращает связанное свойство progress.
final PropertyChangeSupport getPropertyChangeSupport()
Возвращает PropertyChangeSupport для этого SwingWorker.
final SwingWorker.StateValue getState()
Возвращает связанное свойство состояния SwingWorker.
final boolean isCancelled()
Возвращает true, если эта задача была отменена до её нормального завершения.
final boolean isDone()
Возвращает true, если эта задача завершилась.
protected void process(List<V> chunks)
Получает фрагменты данных из метода publish асинхронно в Потоке обработки событий.
protected final void publish(V... chunks)
Отправляет фрагменты данных в метод process(java.util.List<V>).
final void removePropertyChangeListener(PropertyChangeListener listener)
Удаляет слушателя из списка слушателей.
final void run()
Устанавливает результат вычисления для этого Future, если оно не было отменено.
protected final void setProgress(int progress)
Устанавливает связанное свойство progress.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Методы, объявленные в интерфейсе java.util.concurrent.Future

exceptionNow, resultNow, state

Подробное описание конструкторов

SwingWorker

public SwingWorker()
Создаёт этот SwingWorker.

Подробное описание методов

doInBackground

protected abstract T doInBackground() throws Exception
Вычисляет результат или генерирует исключение, если это невозможно.

Обратите внимание, что этот метод выполняется только один раз.

Примечание: этот метод выполняется в фоновом потоке.

Возвращает:
вычисленный результат
Исключения:
Exception - если вычисление результата невозможно

run

public final void run()
Устанавливает этот Future в результат вычисления, если он не был отменён.
Определено в:
run в интерфейсе Runnable
Определено в:
run в интерфейсе RunnableFuture<T>

publish

@SafeVarargs protected final void publish(V... chunks)
Отправляет фрагменты данных в метод process(java.util.List<V>). Этот метод должен использоваться изнутри метода doInBackground для передачи промежуточных результатов для обработки на потоке обработки событий (Event Dispatch Thread) внутри метода process.

Поскольку метод process вызывается асинхронно в потоке обработки событий (Event Dispatch Thread), могут произойти несколько вызовов метода publish до выполнения метода process. Для повышения производительности все эти вызовы объединяются в один вызов с конкатенированными аргументами.

Например:

 publish("1");
 publish("2", "3");
 publish("4", "5", "6");
 
может привести к:
 process("1", "2", "3", "4", "5", "6")
 

Пример использования. Этот фрагмент кода загружает данные в таблицу и обновляет DefaultTableModel этими данными. Обратите внимание, что безопасно изменять модель таблицы внутри метода process, так как он вызывается в потоке обработки событий (Event Dispatch Thread).

 class TableSwingWorker extends
         SwingWorker<DefaultTableModel, Object[]> {
     private final DefaultTableModel tableModel;

     public TableSwingWorker(DefaultTableModel tableModel) {
         this.tableModel = tableModel;
     }

     @Override
     protected DefaultTableModel doInBackground() throws Exception {
         for (Object[] row = loadData();
                  ! isCancelled() && row != null;
                  row = loadData()) {
             publish((Object[]) row);
         }
         return tableModel;
     }

     @Override
     protected void process(List<Object[]> chunks) {
         for (Object[] row : chunks) {
             tableModel.addRow(row);
         }
     }
 }
 
Параметры:
chunks - промежуточные результаты для обработки
См. также:
  • process(java.util.List<V>)

process

protected void process(List<V> chunks)
Принимает фрагменты данных из метода publish асинхронно в потоке обработки событий (Event Dispatch Thread).

Подробнее см. метод publish(V...).

Параметры:
chunks - промежуточные результаты для обработки
См. также:
  • publish(V...)

done

protected void done()
Выполняется в потоке обработки событий (Event Dispatch Thread) после завершения метода doInBackground. По умолчанию ничего не делает. Подклассы могут переопределять этот метод для выполнения действий завершения в потоке обработки событий (Event Dispatch Thread). Обратите внимание, что вы можете запросить состояние внутри реализации этого метода, чтобы определить результат этой задачи или отменена ли она.
См. также:
  • doInBackground()
  • isCancelled()
  • get()

setProgress

protected final void setProgress(int progress)
Устанавливает свойство прогресса. Значение должно быть от 0 до 100.

Поскольку уведомления о прогрессе отправляются асинхронно в поток обработки событий (Event Dispatch Thread), могут произойти несколько вызовов метода setProgress до вызова любых PropertyChangeListeners. Для повышения производительности все эти вызовы объединяются в один вызов с аргументом последнего вызова.

Например, следующие вызовы:

 setProgress(1);
 setProgress(2);
 setProgress(3);
 
могут привести к одному уведомлению о прогрессе со значением 3.
Параметры:
progress - значение прогресса для установки
Исключения:
IllegalArgumentException - если значение не находится в диапазоне от 0 до 100

getProgress

public final int getProgress()
Возвращает свойство прогресса.
Возвращает:
свойство прогресса.

execute

public final void execute()
Планирует выполнение этой SwingWorker в рабочем потоке. Доступно несколько рабочих потоков. В случае, если все рабочие потоки заняты обработкой других SwingWorkers, эта SwingWorker помещается в очередь ожидания.

Примечание: SwingWorker предназначена для выполнения только один раз. Выполнение SwingWorker более одного раза не приведет к вызову метода doInBackground дважды.

cancel

public final boolean cancel(boolean mayInterruptIfRunning)
Пытается отменить выполнение этой задачи. Этот метод не имеет эффекта, если задача уже завершена или отменена, или не может быть отменена по какой-либо другой причине. В противном случае, если задача ещё не начата при вызове cancel, она никогда не должна выполняться. Если задача уже начата, то параметр mayInterruptIfRunning определяет, прерывается ли поток, выполняющий эту задачу (если он известен реализации), в попытке остановить задачу.

Значение, возвращаемое этим методом, не обязательно указывает, отменена ли сейчас задача; используйте Future.isCancelled().

Определено в:
cancel в интерфейсе Future<T>
Параметры:
mayInterruptIfRunning - true, если поток, выполняющий эту задачу, должен быть прерван (если поток известен реализации); в противном случае текущие задачи могут завершиться
Возвращает:
false, если задачу нельзя отменить, обычно потому, что она уже завершена; true в противном случае. Если две или более потоков пытаются отменить задачу, то хотя бы один из них возвращает true. Реализации могут предоставить более сильные гарантии.

isCancelled

public final boolean isCancelled()
Возвращает true, если эта задача была отменена до её нормального завершения.
Определено в:
isCancelled в интерфейсе Future<T>
Возвращает:
true, если эта задача была отменена до её завершения

isDone

public final boolean isDone()
Возвращает true, если эта задача завершилась. Завершение может быть вызвано нормальным завершением, исключением или отменением — во всех этих случаях этот метод вернёт true.
Определено в:
isDone в интерфейсе Future<T>
Возвращает:
true, если эта задача завершилась

get

public final T get() throws InterruptedException, ExecutionException
Ожидает завершения вычисления и возвращает его результат.

Примечание: вызов get в потоке обработки событий (Event Dispatch Thread) блокирует все события, включая перерисовки, до завершения этой SwingWorker.

Когда вы хотите, чтобы SwingWorker блокировал поток обработки событий (Event Dispatch Thread), рекомендуется использовать модальное диалоговое окно.

Например:

 class SwingWorkerCompletionWaiter implements PropertyChangeListener {
     private JDialog dialog;

     public SwingWorkerCompletionWaiter(JDialog dialog) {
         this.dialog = dialog;
     }

     public void propertyChange(PropertyChangeEvent event) {
         if ("state".equals(event.getPropertyName())
                 && SwingWorker.StateValue.DONE == event.getNewValue()) {
             dialog.setVisible(false);
             dialog.dispose();
         }
     }
 }
 JDialog dialog = new JDialog(owner, true);
 swingWorker.addPropertyChangeListener(
     new SwingWorkerCompletionWaiter(dialog));
 swingWorker.execute();
 //the dialog will be visible until the SwingWorker is done
 dialog.setVisible(true);
 
Определено в:
get в интерфейсе Future<T>
Возвращает:
вычисленный результат
Исключения:
CancellationException - если вычисление было отменено
InterruptedException - если текущий поток был прерван во время ожидания
ExecutionException - если вычисление выбросило исключение

get

public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
Ожидает завершения вычисления не более заданного времени и возвращает его результат, если он доступен.

Подробнее см. get().

Определено в:
get в интерфейсе Future<T>
Параметры:
timeout - максимальное время ожидания
unit - единицы измерения времени для аргумента таймаута
Возвращает:
вычисленный результат
Исключения:
CancellationException - если вычисление было отменено
InterruptedException - если текущий поток был прерван во время ожидания
ExecutionException - если вычисление выбросило исключение
TimeoutException - если ожидание истекло

addPropertyChangeListener

public final void addPropertyChangeListener(PropertyChangeListener listener)
Добавляет обработчик событий изменения свойства в список обработчиков. Обработчик регистрируется для всех свойств. Один и тот же объект обработчика может быть добавлен более одного раза и будет вызван столько раз, сколько раз он был добавлен. Если listener является null, исключение не генерируется, и никаких действий не выполняется.

Примечание: это просто обертка для удобства. Все действия делегируются методу PropertyChangeSupport из getPropertyChangeSupport().

Параметры:
listener - добавляемый обработчик событий изменения свойства

removePropertyChangeListener

public final void removePropertyChangeListener(PropertyChangeListener listener)
Удаляет слушателя PropertyChangeListener из списка слушателей. Это удаляет слушателя PropertyChangeListener, который был зарегистрирован для всех свойств. Если listener был добавлен более одного раза к одному и тому же источнику событий, он будет уведомлен на один раз меньше после удаления. Если listener является null или никогда не был добавлен, исключение не выбрасывается, и никаких действий не выполняется.

Примечание: это просто удобная обертка. Вся работа делегируется PropertyChangeSupport из getPropertyChangeSupport().

Parameters:
listener - удаляемый слушатель PropertyChangeListener

firePropertyChange

public final void firePropertyChange(String propertyName, Object oldValue, Object newValue)
Сообщает зарегистрированным слушателям об обновлении связанного свойства. Событие не генерируется, если old и new равны и не равны null.

Этот SwingWorker будет источником любых сгенерированных событий.

При вызове вне потока обработки событий слушатели уведомляются асинхронно в потоке обработки событий.

Примечание: это просто удобная обертка. Вся работа делегируется PropertyChangeSupport из getPropertyChangeSupport().

Parameters:
propertyName - программируемое имя изменённого свойства
oldValue - старое значение свойства
newValue - новое значение свойства

getPropertyChangeSupport

public final PropertyChangeSupport getPropertyChangeSupport()
Возвращает PropertyChangeSupport для этого SwingWorker. Этот метод используется при необходимости гибкого доступа к поддержке связанных свойств.

Этот SwingWorker будет источником любых сгенерированных событий.

Примечание: возвращаемый PropertyChangeSupport уведомляет любых слушателей PropertyChangeListener асинхронно в потоке обработки событий в случае, если firePropertyChange или fireIndexedPropertyChange вызываются вне потока обработки событий.

Returns:
PropertyChangeSupport для этого SwingWorker

getState

public final SwingWorker.StateValue getState()
Возвращает состояние связанного свойства SwingWorker.
Returns:
текущее состояние

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.desktop/javax/swing/SwingWorker.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API