SwingWorker — это абстрактный класс, разработанный для библиотеки Swing языка программирования Java. Он используется для выполнения длительных задач взаимодействия с графическим интерфейсом в фоновом потоке. При разработке приложений иногда GUI зависает, когда пытается выполнить какую-то огромную или длительную задачу. Это отставание является большим узким местом. Для таких целей разработан SwingWorker, который планирует выполнение этой длительной задачи в другом потоке, в то время как графический интерфейс все еще остается отзывчивым.
Язык Java имеет три потока , а именно:
- Текущий поток (исходный поток): это поток, в котором выполняется исходная логика приложения.
- Поток отправки событий : весь код обработки событий выполняется в этом потоке.
- Рабочие потоки : также известны как фоновые потоки, где выполняются все трудоемкие фоновые задачи.
SwingWorker позволяет пользователю планировать выполнение фоновой задачи в рабочем потоке. Но как пользователь узнает, когда задача закончила свое выполнение или нужно ли пользователю обновлять графический интерфейс (запущенный в начальном потоке) в соответствии с выполнением потока? Это подразумевает, что нам также нужна межпотоковая связь . SwingWorker разработан для таких сложных ситуаций, которые обеспечивают связь в потоке диспетчеризации событий.
Важные методы SwingWorker:
- doInBackground () : эта функция содержит нашу логику фоновой задачи, то есть то, что мы хотим, чтобы наш поток делал. Эта функция выполняется в рабочем потоке и ее необходимо реализовать.
protected abstract T doInBackground() throws Exception Computes a result, or throws an exception if unable to do so. This method is executed in a background thread. Returns: the computed result Throws: Exception - if unable to compute a result
- done () : эта функция вызывается, когда поток завершает выполнение. Также любое значение, возвращаемое функцией doInBackground (), может быть получено внутри этой функции с помощью get (). Кроме того, обновления могут быть сделаны в GUI внутри этой функции. Таким образом, функция выполняется в потоке диспетчеризации событий после завершения метода doInBackground.
protected void done()
- execute () : планирует этот SwingWorker для выполнения в рабочем потоке.
public final void execute()
- publish () : этот метод должен использоваться внутри метода doInBackground для доставки промежуточных результатов для обработки в потоке диспетчеризации событий внутри метода процесса.
protected final void publish(V... chunks)
- process () : асинхронно получает фрагменты данных из метода публикации в потоке диспетчеризации событий. Поскольку этот метод вызывается асинхронно, publish () мог вызываться несколько раз.
protected void process(List chunks) Parameters: chunks - intermediate results to process
- run (): устанавливает это будущее как результат вычисления, если оно не было отменено.
public final void run()
- setProgress: устанавливает свойство выполнения прогресса. Значение должно быть от 0 до 100.
protected final void setProgress(int progress) Example: setProgress(1); setProgress(2); setProgress(3); might result in a single PropertyChangeListener notification with the value 3. Parameters: progress - the progress value to set Throws: IllegalArgumentException - is value not from 0 to 100
- getProgress: возвращает свойство, связанное с прогрессом.
public final int getProgress() Returns: the progress bound property.
- отменить: Пытается отменить выполнение этого задания. Эта попытка потерпит неудачу, если задача уже завершена, уже отменена или не может быть отменена по какой-либо другой причине. Если успешно, и эта задача не была запущена при вызове отмены, эта задача никогда не должна выполняться. Если задача уже началась, параметр mayInterruptIfRunning определяет, следует ли прерывать поток, выполняющий эту задачу, в попытке остановить задачу.
После возврата этого метода последующие вызовы Future.isDone () всегда будут возвращать true. Последующие вызовы Future.isCancelled () всегда будут возвращать true, если этот метод вернул true.public final boolean cancel(boolean mayInterruptIfRunning) Parameters: mayInterruptIfRunning - true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete Returns: false if the task could not be cancelled, typically because it has already completed normally; true otherwise
- isCancelled: возвращает true, если эта задача была отменена до ее нормального завершения.
public final boolean isCancelled() Returns: true if this task was cancelled before it completed
- isDone: возвращает true, если эта задача выполнена. Завершение может быть связано с обычным завершением, исключением или отменой — во всех этих случаях этот метод будет возвращать true.
public final boolean isDone() Returns: true if this task completed
- get: При необходимости ожидает завершения вычисления, а затем извлекает его результат.
public final T get() throws InterruptedException, ExecutionException
- getState: возвращает свойство, связанное с состоянием SwingWorker.
public final SwingWorker.StateValue getState() Returns: the current state
Пример для иллюстрации SwingWorker
Мы хотим, чтобы поток запускался при нажатии кнопки. Смотрите startThread () внутри слушателя действия кнопки. Функция startThread определяет нового работника качания типа javax.swing.SwingWorker, где:
T — тип результата, возвращаемый этим методом SwInWorker doInBackground и get, который является строкой в приведенном ниже коде.
V — тип, используемый для выполнения промежуточных результатов методами публикации и обработки этого SwingWorker, который представляет собой Integer в приведенном ниже коде.
|
- Запустите приведенный выше код, нажмите кнопку, и вы увидите уменьшение счетчика. Одновременно делайте что-нибудь с пользовательским интерфейсом, он все равно будет отзывчивым.
- Список чанков является параметром функции process () и содержит список всех результатов, опубликованных потоком до этого времени типа данных Integer. Тип данных Integer должен соответствовать нашему объявлению Swingworker.
Заявка:
Создание индикатора выполнения, показывающего ход выполнения задачи.
Эта статья предоставлена Ekta Goel . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Java.util.LinkedList.poll (), pollFirst (), pollLast () с примерами на Java
- Java lang.Long.byteValue () метод в Java с примерами
- Java lang.Long.reverse () метод в Java с примерами
- Класс Java.util.concurrent.RecursiveTask в Java с примерами
- Java.util.LinkedList.peek (), peekfirst (), peeklast () в Java
- Java.util.LinkedList.offer (), offerFirst (), offerLast () в Java
- Java.util.Collections.rotate () Метод в Java с примерами
- Java.util.concurrent.Phaser класс в Java с примерами
- Java lang.Long.numberOfLeadingZeros () метод в Java с примерами
- Java lang.Long.lowestOneBit () метод в Java с примерами
- Класс Java.util.concurrent.RecursiveAction в Java с примерами
- Java.util.Collections.disjoint () Метод в Java с примерами
- Java.util.function.IntPredicate интерфейс в Java с примерами
- Java lang.Long.numberOfTrailingZeros () метод в Java с примерами
- Java.util.function.LongPredicate интерфейс в Java с примерами
0.00 (0%) 0 votes