Spec-Zone.ru › OpenJavaFX 17

Класс Task<V>

java.lang.Object
java.util.concurrent.FutureTask<V>
javafx.concurrent.Task<V>
Все реализованные интерфейсы:
Runnable, Future<V>, RunnableFuture<V>, Worker<V>, EventTarget
public abstract class Task<V>
extends FutureTask<V>
implements Worker<V>, EventTarget

Полностью наблюдаемая реализация FutureTask. Task предоставляет дополнительное состояние и наблюдаемые свойства, полезные для программирования асинхронных задач в JavaFX, как определено в интерфейсе Worker. Реализация Task должна переопределять метод call(). Этот метод вызывается в фоновом потоке. Любое состояние, используемое в этом методе, должно быть безопасным для чтения и записи из фонового потока. Например, манипулирование активной схемой сцены из этого метода небезопасно и приведет к исключениям во время выполнения.

Задачи гибкие и очень полезны для инкапсуляции "работы". Поскольку Service предназначен для выполнения задачи Task, любые задачи, определенные кодом приложения или библиотеки, могут легко использоваться с сервисом. Аналогично, поскольку Task расширяет FutureTask, очень легко и естественно использовать Task с API конкуретности Java Executor. Поскольку Task является Runnable, вы также можете вызвать его напрямую (вызвав метод FutureTask.run()), из другого фонового потока. Это позволяет составлять работу или передавать ее в новый поток, созданный и запущенный вручную. Наконец, поскольку вы можете вручную создать новый поток, передав ему Runnable, можно использовать следующий фрагмент кода:


         Thread th = new Thread(task);
         th.setDaemon(true);
         th.start();
     

Обратите внимание, что этот код устанавливает флаг daemon потока в true. Если вы хотите, чтобы фоновый поток предотвращал выход VM после закрытия последней стадии, тогда вы хотите, чтобы daemon был false. Однако, если вы хотите, чтобы фоновые потоки просто завершились после закрытия всех стадий, вы должны установить daemon в true.

Хотя ExecutorService определяет несколько методов, которые принимают Runnable, вам следует ограничиться использованием метода execute, унаследованного от Executor.

Как и FutureTask, Task — это одноразовый класс и не может быть повторно использован. См. Service для повторно используемого Worker.

Поскольку Task предназначен для использования с графическими приложениями JavaFX, он гарантирует, что каждое изменение его публичных свойств, а также уведомления о состоянии, ошибках и обработчиках событий происходят в основном потоке приложения JavaFX. Доступ к этим свойствам из фонового потока (включая метод call()) приведет к возникновению исключений во время выполнения. Единственное исключение из этого правила — первоначальная настройка Task, которая может быть выполнена из любого потока. Однако после инициализации и запуска Task он может использоваться только из потока FX (кроме методов, явно помеченных как подходящие для вызова подклассом из фонового потока).

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

В Java нет надежного способа "убить" поток в процессе. Однако, когда cancel вызывается на Task, важно, чтобы Task прекратил обработку. "Незавершающаяся" задача может продолжить обработку и обновление свойств сообщения, текста и прогресса даже после того, как Task был отменен! В Java отмена Task — это совместная работа. Пользователь Task запросит его отмену, а автор Task должен проверить, был ли он отменен внутри тела метода call. Это можно сделать двумя способами. Во-первых, автор Task может проверить метод isCancelled(), унаследованный от FutureTask, чтобы увидеть, был ли Task отменен. Во-вторых, если реализация Task использует какие-либо блокирующие вызовы (например, прерывимые каналы NIO или Thread.sleep), и задача отменяется во время такого блокирующего вызова, генерируется InterruptedException. Реализации Task, которые имеют блокирующие вызовы, должны понимать, что прерванный поток может быть сигналом отмены задачи, и должны дважды проверить метод isCancelled, чтобы убедиться, что InterruptedException был вызван из-за отмены Task.

Примеры

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

Простая циклическая итерация

Первый пример — простая циклическая итерация, которая не делает ничего особенно полезного, но демонстрирует основные аспекты правильного написания Task. Этот пример просто выполняет цикл и выводит на стандартный вывод значение на каждой итерации. При завершении он возвращает количество итераций.


     Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations;
             for (iterations = 0; iterations < 100000; iterations++) {
                 if (isCancelled()) {
                     break;
                 }
                 System.out.println("Iteration " + iterations);
             }
             return iterations;
         }
     };
 

Сначала мы определяем, какой тип значения возвращается от этой задачи. В этом случае мы хотим вернуть количество итераций, поэтому мы укажем Task как тип Integer, используя дженерики. Затем, в реализации метода call, мы повторяем от 0 до 100000. На каждой итерации мы проверяем, была ли эта задача отменена. Если она была отменена, мы выходим из цикла и возвращаем количество итераций. В противном случае выводится сообщение в консоль, увеличивается счетчик итераций, и мы продолжаем цикл.

Проверка isCancelled() в теле цикла имеет решающее значение, иначе разработчик может отменить задачу, но задача продолжит работу и обновление прогресса, возвращая неверный результат из конца метода call. Правильная реализация Task всегда проверяет отмену.

Простая циклическая итерация с уведомлением о прогрессе

Аналогично предыдущему примеру, только в этот раз мы изменим прогресс задачи на каждой итерации. Обратите внимание, что у нас есть выбор в случае отмены. Хотим ли мы установить прогресс обратно в -1 (неопределенный) при отмене задачи или хотим ли мы оставить прогресс на том же уровне? В этом случае давайте оставим прогресс без изменений и обновим только сообщение при отмене, хотя обновление прогресса после отмены — вполне допустимый выбор.


     Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations;
             for (iterations = 0; iterations < 10000000; iterations++) {
                 if (isCancelled()) {
                     updateMessage("Cancelled");
                     break;
                 }
                 updateMessage("Iteration " + iterations);
                 updateProgress(iterations, 10000000);
             }
             return iterations;
         }
     };
 

Как и прежде, внутри цикла for мы проверяем, была ли задача отменена. Если она была отменена, мы обновим сообщение Task, чтобы указать, что она была отменена, и затем выйдем из цикла, как и раньше. Если задача не была отменена, мы обновим ее сообщение, чтобы указать текущую итерацию, и обновим прогресс, чтобы указать текущий прогресс.

Простая циклическая итерация с уведомлением о прогрессе и блокирующими вызовами

Этот пример добавляет к предыдущим примерам блокирующий вызов. Поскольку блокирующий вызов может вызвать InterruptedException, а InterruptedException может произойти в результате отмены Task, нам нужно убедиться, что мы обрабатываем InterruptedException и проверяем состояние отмены.


     Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations;
             for (iterations = 0; iterations < 1000; iterations++) {
                 if (isCancelled()) {
                     updateMessage("Cancelled");
                     break;
                 }
                 updateMessage("Iteration " + iterations);
                 updateProgress(iterations, 1000);

                 // Now block the thread for a short time, but be sure
                 // to check the interrupted exception for cancellation!
                 try {
                     Thread.sleep(100);
                 } catch (InterruptedException interrupted) {
                     if (isCancelled()) {
                         updateMessage("Cancelled");
                         break;
                     }
                 }
             }
             return iterations;
         }
     };
 

Здесь мы добавили в тело цикла вызов Thread.sleep. Поскольку это блокирующий вызов, мне нужно обработать потенциальное исключение InterruptedException. В блоке catch я проверю, была ли задача отменена, и если да, то обновим сообщение соответствующим образом и выйдем из цикла.

Задача, которая принимает параметры

Большинство задач требуют некоторых параметров для выполнения полезной работы. Например, задача DeleteRecordTask нуждается в объекте или первичном ключе для удаления из базы данных. Задача ReadFileTask нуждается в URI файла, который нужно прочитать. Поскольку Task работает в фоновом потоке, необходимо позаботиться о том, чтобы тело метода call не считывало или не изменяло общее состояние. Для этого наиболее полезны два метода: использование final переменных и передача переменных Task при создании.

При использовании Task в качестве анонимного класса наиболее естественный способ передачи параметров Task — использование final переменных. В этом примере мы передаем Task общее число итераций, которые она должна выполнить.


     final int totalIterations = 9000000;
     Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations;
             for (iterations = 0; iterations < totalIterations; iterations++) {
                 if (isCancelled()) {
                     updateMessage("Cancelled");
                     break;
                 }
                 updateMessage("Iteration " + iterations);
                 updateProgress(iterations, totalIterations);
             }
             return iterations;
         }
     };
 

Поскольку totalIterations является final, метод call может безопасно прочитать и обратиться к нему из фонового потока.

При написании библиотек Task (в отличие от реализаций для конкретных задач) нам нужен другой метод. В этом случае я создам IteratingTask, который выполняет ту же работу, что и выше. На этот раз, поскольку IteratingTask определен в своем собственном файле, ему необходимо будет передать параметры в его конструкторе. Эти параметры присваиваются final переменным.


     public class IteratingTask extends Task<Integer> {
         private final int totalIterations;

         public IteratingTask(int totalIterations) {
             this.totalIterations = totalIterations;
         }

         @Override protected Integer call() throws Exception {
             int iterations = 0;
             for (iterations = 0; iterations < totalIterations; iterations++) {
                 if (isCancelled()) {
                     updateMessage("Cancelled");
                     break;
                 }
                 updateMessage("Iteration " + iterations);
                 updateProgress(iterations, totalIterations);
             }
             return iterations;
         }
     }
 

И затем при использовании:


     IteratingTask task = new IteratingTask(8000000);
 

Таким образом, параметры передаются IteratingTask безопасным способом, и снова являются final. Таким образом, метод call может безопасно прочитать это состояние из фонового потока.

ПРЕДУПРЕЖДЕНИЕ: Не передавайте изменяемое состояние в Task и не работайте с ним из фонового потока. Это может привести к возникновению гонок. В частности, предположим, что у вас есть SaveCustomerTask, который принимает Customer в своем конструкторе. Хотя SaveCustomerTask может иметь final ссылку на Customer, если объект Customer изменяемый, то возможно, что SaveCustomerTask и какой-то другой код приложения будут читать или изменять состояние Customer из разных потоков. Будьте очень осторожны в таких случаях, когда изменяемый объект, такой как этот Customer, используется из фонового потока, не используется также из другого потока. В частности, если фоновый поток считывает данные из базы данных и обновляет объект Customer, а объект Customer привязан к узлам схемы сцены (таким как элементы пользовательского интерфейса), то это может нарушить правила потоков! В таких случаях изменяйте объект Customer из потока FX-приложения, а не из фонового потока.


     public class UpdateCustomerTask extends Task<Customer> {
         private final Customer customer;

         public UpdateCustomerTask(Customer customer) {
             this.customer = customer;
         }

         @Override protected Customer call() throws Exception {
             // pseudo-code:
             //   query the database
             //   read the values

             // Now update the customer
             Platform.runLater(new Runnable() {
                 @Override public void run() {
                     customer.setFirstName(rs.getString("FirstName"));
                     // etc
                 }
             });

             return customer;
         }
     }
 

Задача, которая не возвращает значение

Многие, если не большинство, Task должны возвращать значение по завершении. Для задач CRUD можно ожидать, что задача "Создать" вернет новый созданный объект или первичный ключ, задача "Прочитать" вернет прочитанный объект, задача "Обновить" вернет количество обновленных записей, а задача "Удалить" вернет количество удаленных записей.

Однако иногда просто нет ничего действительно полезного для возврата. Например, у меня может быть задача, которая записывает в файл. В задаче встроен механизм для указания того, выполнилась она успешно или нет, а также количество записанных байтов (прогресс), и, следовательно, для меня ничего действительно не нужно возвращать. В таком случае вы можете использовать тип Void. Это специальный тип в языке Java, которому можно назначить только значение null. Вы бы использовали его следующим образом:


     final String filePath = "/foo.txt";
     final String contents = "Some contents";
     Task<Void> task = new Task<Void>() {
         @Override protected Void call() throws Exception {
             File file = new File(filePath);
             FileOutputStream out = new FileOutputStream(file);
             // ... and other code to write the contents ...

             // Return null at the end of a Task of type Void
             return null;
         }
     };
 

Задача, возвращающая ObservableList

Поскольку ListView, TableView и другие элементы UI и узлы графа сцены используют ObservableList, часто возникает необходимость создавать и возвращать ObservableList из задачи. Когда вам не нужно отображать промежуточные значения, самый простой способ правильно написать такую задачу — просто создать ObservableList внутри метода call, а затем вернуть его по завершении задачи.


     Task<ObservableList<Rectangle>> task = new Task<ObservableList<Rectangle>>() {
         @Override protected ObservableList<Rectangle> call() throws Exception {
             updateMessage("Creating Rectangles");
             ObservableList<Rectangle> results = FXCollections.observableArrayList();
             for (int i=0; i<100; i++) {
                 if (isCancelled()) break;
                 Rectangle r = new Rectangle(10, 10);
                 r.setX(10 * i);
                 results.add(r);
                 updateProgress(i, 100);
             }
             return results;
         }
     };
 

В приведенном выше примере мы собираемся создать 100 прямоугольников и вернуть их из этой задачи. ObservableList создается внутри метода call, заполняется и затем возвращается.

Задача, возвращающая частичные результаты

Иногда вы хотите создать задачу, которая будет возвращать частичные результаты. Возможно, вы создаете сложный граф сцены и хотите отобразить граф сцены по мере его создания. Или, возможно, вы читаете большое количество данных по сети и хотите отобразить записи в TableView по мере поступления данных. В таких случаях доступно некоторое общее состояние, доступное как для потока FX-приложения, так и для фонового потока. Необходимо соблюдать особую осторожность, чтобы никогда не обновлять общее состояние из любого потока, кроме потока FX-приложения.

Самый простой способ сделать это — воспользоваться методом updateValue(Object). Этот метод можно вызывать многократно из фонового потока. Обновления объединяются для предотвращения насыщения очереди событий FX. Это означает, что вы можете вызывать его так часто, как хотите, из фонового потока, но в конечном итоге устанавливается только самый последний набор.


     Task<Long> task = new Task<Long>() {
         @Override protected Long call() throws Exception {
             long a = 0;
             long b = 1;
             for (long i = 0; i < Long.MAX_VALUE; i++) {
                 updateValue(a);
                 a += b;
                 b = a - b;
             }
             return a;
         }
     };
 

Другой способ сделать это — экспонировать новое свойство в задаче, которое будет представлять частичный результат. Затем убедитесь, что используете Platform.runLater при обновлении частичного результата.


     Task<Long> task = new Task<Long>() {
         @Override protected Long call() throws Exception {
             long a = 0;
             long b = 1;
             for (long i = 0; i < Long.MAX_VALUE; i++) {
                 final long v = a;
                 Platform.runLater(new Runnable() {
                     @Override public void run() {
                         updateValue(v);
                     }
                 }
                 a += b;
                 b = a - b;
             }
             return a;
         }
     };
 

Предположим, вместо обновления одного значения вы хотите заполнить ObservableList результатами по мере их получения. Один из подходов — экспонировать новое свойство в задаче, которое будет представлять частичный результат. Затем убедитесь, что используете Platform.runLater при добавлении новых элементов в частичный результат.


     public class PartialResultsTask extends Task<ObservableList<Rectangle>> {
         // Uses Java 7 diamond operator
         private ReadOnlyObjectWrapper<ObservableList<Rectangle>> partialResults =
                 new ReadOnlyObjectWrapper<>(this, "partialResults",
                         FXCollections.observableArrayList(new ArrayList<Rectangle>()));

         public final ObservableList<Rectangle> getPartialResults() { return partialResults.get(); }
         public final ReadOnlyObjectProperty<ObservableList<Rectangle>> partialResultsProperty() {
             return partialResults.getReadOnlyProperty();
         }

         @Override protected ObservableList<Rectangle> call() throws Exception {
             updateMessage("Creating Rectangles...");
             for (int i=0; i<100; i++) {
                 if (isCancelled()) break;
                 final Rectangle r = new Rectangle(10, 10);
                 r.setX(10 * i);
                 Platform.runLater(new Runnable() {
                     @Override public void run() {
                         partialResults.get().add(r);
                     }
                 });
                 updateProgress(i, 100);
             }
             return partialResults.get();
         }
     }
 

Задача, изменяющая граф сцены

Как правило, задачи не должны напрямую взаимодействовать с пользовательским интерфейсом. Это создает тесную связь между конкретной реализацией задачи и конкретной частью вашего пользовательского интерфейса. Однако, когда вам нужно создать такую связь, вы должны убедиться, что используете Platform.runLater, чтобы любые изменения в графе сцены происходили в потоке FX-приложения.


     final Group group = new Group();
     Task<Void> task = new Task<Void>() {
         @Override protected Void call() throws Exception {
             for (int i=0; i<100; i++) {
                 if (isCancelled()) break;
                 final Rectangle r = new Rectangle(10, 10);
                 r.setX(10 * i);
                 Platform.runLater(new Runnable() {
                     @Override public void run() {
                         group.getChildren().add(r);
                     }
                 });
             }
             return null;
         }
     };
 

Реагирование на изменения состояния в общем виде

Иногда вы можете написать задачу, которая обновляет свой прогресс, сообщение, текст или каким-либо другим способом реагирует всякий раз, когда происходит изменение состояния задачи. Например, вы можете изменить сообщение о состоянии задачи при изменениях состояния «Ошибка», «Успех», «Выполнение» или «Отмена».


     Task<Integer> task = new Task<Integer>() {
         @Override protected Integer call() throws Exception {
             int iterations = 0;
             for (iterations = 0; iterations < 100000; iterations++) {
                 if (isCancelled()) {
                     break;
                 }
                 System.out.println("Iteration " + iterations);
             }
             return iterations;
         }

         @Override protected void succeeded() {
             super.succeeded();
             updateMessage("Done!");
         }

         @Override protected void cancelled() {
             super.cancelled();
             updateMessage("Cancelled!");
         }

         @Override protected void failed() {
             super.failed();
             updateMessage("Failed!");
         }
     };
 
С момента:
JavaFX 2.0

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

Свойства
Тип Свойство Описание
ObjectProperty<EventHandler<WorkerStateEvent>> onCancelled
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
ObjectProperty<EventHandler<WorkerStateEvent>> onFailed
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
ObjectProperty<EventHandler<WorkerStateEvent>> onRunning
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
ObjectProperty<EventHandler<WorkerStateEvent>> onScheduled
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
ObjectProperty<EventHandler<WorkerStateEvent>> onSucceeded
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.

Свойства, объявленные в интерфейсе javafx.concurrent.Worker

exception, message, progress, running, state, title, totalWork, value, workDone

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

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

Worker.State

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

Конструкторы
Конструктор Описание
Task()
Создает новую задачу.

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

Модификатор и тип Метод Описание
<T extends Event>
void
addEventFilter​(EventType<T> eventType, EventHandler<? super T> eventFilter)
Регистрирует фильтр событий для этой задачи.
<T extends Event>
void
addEventHandler​(EventType<T> eventType, EventHandler<? super T> eventHandler)
Регистрирует обработчик событий для этой задачи.
protected abstract V call()
Вызывается при выполнении задачи; метод вызова должен быть переопределен и реализован подклассами.
protected void cancelled()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние CANCELLED.
protected void failed()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние FAILED.
void fireEvent​(Event event)
Срабатывает указанное событие.
EventHandler<WorkerStateEvent> getOnCancelled()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
EventHandler<WorkerStateEvent> getOnFailed()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
EventHandler<WorkerStateEvent> getOnRunning()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
EventHandler<WorkerStateEvent> getOnScheduled()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
EventHandler<WorkerStateEvent> getOnSucceeded()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
<T extends Event>
void
removeEventFilter​(EventType<T> eventType, EventHandler<? super T> eventFilter)
Отменяет ранее зарегистрированный фильтр событий из этой задачи.
<T extends Event>
void
removeEventHandler​(EventType<T> eventType, EventHandler<? super T> eventHandler)
Отменяет ранее зарегистрированный обработчик событий из этой задачи.
protected void running()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние RUNNING.
protected void scheduled()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
protected <T extends Event>
void
setEventHandler​(EventType<T> eventType, EventHandler<? super T> eventHandler)
Устанавливает обработчик для этого типа событий.
void setOnCancelled​(EventHandler<WorkerStateEvent> value)
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
void setOnFailed​(EventHandler<WorkerStateEvent> value)
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
void setOnRunning​(EventHandler<WorkerStateEvent> value)
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
void setOnScheduled​(EventHandler<WorkerStateEvent> value)
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
void setOnSucceeded​(EventHandler<WorkerStateEvent> value)
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
protected void succeeded()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
protected void updateMessage​(String message)
Обновляет свойство message.
protected void updateProgress​(double workDone, double max)
Обновляет свойства workDone, totalWork и progress.
protected void updateProgress​(long workDone, long max)
Обновляет свойства workDone, totalWork и progress.
protected void updateTitle​(String title)
Обновляет свойство title.
protected void updateValue​(V value)
Обновляет свойство value.

Методы, объявленные в классе java.util.concurrent.FutureTask

cancel, done, get, get, isCancelled, isDone, run, runAndReset, set, setException, toString

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

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

Методы, объявленные в интерфейсе javafx.event.EventTarget

buildEventDispatchChain

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

cancel, exceptionProperty, getException, getMessage, getProgress, getState, getTitle, getTotalWork, getValue, getWorkDone, isRunning, messageProperty, progressProperty, runningProperty, stateProperty, titleProperty, totalWorkProperty, valueProperty, workDoneProperty

Подробности свойств

onScheduled

public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
С:
JavaFX 2.1
См. также:
getOnScheduled(), setOnScheduled(EventHandler)

onRunning

public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
С:
JavaFX 2.1
См. также:
getOnRunning(), setOnRunning(EventHandler)

onSucceeded

public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
С:
JavaFX 2.1
См. также:
getOnSucceeded(), setOnSucceeded(EventHandler)

onCancelled

public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
С:
JavaFX 2.1
См. также:
getOnCancelled(), setOnCancelled(EventHandler)

onFailed

public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
С:
JavaFX 2.1
См. также:
getOnFailed(), setOnFailed(EventHandler)

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

Task

public Task()
Создает новую задачу.

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

call

protected abstract V call() throws Exception
Вызывается при выполнении задачи, метод call должен быть переопределен и реализован подклассами. Метод call фактически выполняет логику потока фоновой обработки. Из кода внутри этого метода могут быть вызваны только методы updateProgress, updateMessage, updateValue и updateTitle задачи. Любое другое взаимодействие с задачей из фонового потока приведет к исключениям времени выполнения.
Возвращает:
Результат фоновой работы, если таковой имеется.
Исключение:
Exception — необработанное исключение, которое произошло во время фоновой операции

onScheduledProperty

public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
С:
JavaFX 2.1
См. также:
getOnScheduled(), setOnScheduled(EventHandler)

getOnScheduled

public final EventHandler<WorkerStateEvent> getOnScheduled()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
Возвращает:
обработчик события onScheduled, если таковой имеется
С:
JavaFX 2.1

setOnScheduled

public final void setOnScheduled(EventHandler<WorkerStateEvent> value)
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.
Параметры:
value — обработчик события, может быть null для его очистки
С:
JavaFX 2.1

scheduled

protected void scheduled()
Защищенный вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SCHEDULED. Этот метод вызывается в потоке FX Application после того, как задача полностью перешла в новое состояние.
С:
JavaFX 2.1

onRunningProperty

public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
С:
JavaFX 2.1
См. также:
getOnRunning(), setOnRunning(EventHandler)

getOnRunning

public final EventHandler<WorkerStateEvent> getOnRunning()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
Возвращает:
обработчик события onRunning, если таковой имеется
С:
JavaFX 2.1

setOnRunning

public final void setOnRunning(EventHandler<WorkerStateEvent> value)
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.
Параметры:
value — обработчик события, может быть null для его очистки
С:
JavaFX 2.1

running

protected void running()
Защищенный вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние RUNNING. Этот метод вызывается в потоке FX Application после того, как задача полностью перешла в новое состояние.
С:
JavaFX 2.1

onSucceededProperty

public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
С:
JavaFX 2.1
См. также:
getOnSucceeded(), setOnSucceeded(EventHandler)

getOnSucceeded

public final EventHandler<WorkerStateEvent> getOnSucceeded()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
Возвращает:
обработчик события onSucceeded, если таковой имеется
С:
JavaFX 2.1

setOnSucceeded

public final void setOnSucceeded(EventHandler<WorkerStateEvent> value)
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.
Параметры:
value — обработчик события, может быть null для его очистки
С:
JavaFX 2.1

succeeded

protected void succeeded()
Защищенный вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. Этот метод вызывается в потоке FX Application после того, как задача полностью перешла в новое состояние.
С:
JavaFX 2.1

onCancelledProperty

public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
С:
JavaFX 2.1
См. также:
getOnCancelled(), setOnCancelled(EventHandler)

getOnCancelled

public final EventHandler<WorkerStateEvent> getOnCancelled()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
Возвращает:
обработчик события onCancelled, если таковой имеется
С:
JavaFX 2.1

setOnCancelled

public final void setOnCancelled(EventHandler<WorkerStateEvent> value)
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.
Параметры:
value — обработчик события, может быть null для его очистки
С:
JavaFX 2.1

cancelled

protected void cancelled()
Защищенный вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние CANCELLED. Этот метод вызывается в потоке FX Application после того, как задача полностью перешла в новое состояние.
С:
JavaFX 2.1

onFailedProperty

public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
С:
JavaFX 2.1
См. также:
getOnFailed(), setOnFailed(EventHandler)

getOnFailed

public final EventHandler<WorkerStateEvent> getOnFailed()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
Возвращает:
обработчик события onFailed, если таковой имеется
С:
JavaFX 2.1

setOnFailed

public final void setOnFailed(EventHandler<WorkerStateEvent> value)
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.
Параметры:
value — обработчик события, может быть null для его очистки
С:
JavaFX 2.1

failed

protected void failed()
Защищенный вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние FAILED. Этот метод вызывается в потоке FX Application после того, как задача полностью перешла в новое состояние.
С:
JavaFX 2.1

обновитьПрогресс

protected void updateProgress(long workDone, long max)
Обновляет свойства workDone, totalWork и progress. Вызовы updateProgress объединяются и выполняются позже в потоке FX-приложения, и вызовы updateProgress, даже из потока FX-приложения, не обязательно приводят к немедленному обновлению этих свойств, и промежуточные значения workDone могут объединяться для экономии уведомлений об событиях. max становится новым значением для totalWork.

Этот метод безопасно вызывать из любого потока.

Параметры:
workDone - Значение от Long.MIN_VALUE до max. Если значение больше max, оно будет ограничено max. Если переданное значение отрицательное, то полученный процент выполнения будет -1 (то есть неопределённый).
max - Значение от Long.MIN_VALUE до Long.MAX_VALUE.
См. также:
updateProgress(double, double)

обновитьПрогресс

protected void updateProgress(double workDone, double max)
Обновляет свойства workDone, totalWork и progress. Вызовы updateProgress объединяются и выполняются позже в потоке FX-приложения, и вызовы updateProgress, даже из потока FX-приложения, не обязательно приводят к немедленному обновлению этих свойств, и промежуточные значения workDone могут объединяться для экономии уведомлений об событиях. max становится новым значением для totalWork.

Этот метод безопасно вызывать из любого потока.

Параметры:
workDone - Значение от Double.MIN_VALUE до max. Если значение больше max, оно будет ограничено max. Если переданное значение отрицательное, или Infinity, или NaN, то результирующий percentDone будет -1 (то есть неопределённый).
max - Значение от Double.MIN_VALUE до Double.MAX_VALUE. Infinity и NaN обрабатываются как -1.
С тех пор как:
JavaFX 2.2

обновитьСообщение

protected void updateMessage(String message)
Обновляет свойство message. Вызовы updateMessage объединяются и выполняются позже в потоке FX-приложения, поэтому вызовы updateMessage, даже из потока FX-приложения, не обязательно приводят к немедленному обновлению этого свойства, и промежуточные значения сообщений могут объединяться для экономии уведомлений об событиях.

Этот метод безопасно вызывать из любого потока.

Параметры:
message - новое сообщение

обновитьЗаголовок

protected void updateTitle(String title)
Обновляет свойство title. Вызовы updateTitle объединяются и выполняются позже в потоке FX-приложения, поэтому вызовы updateTitle, даже из потока FX-приложения, не обязательно приводят к немедленному обновлению этого свойства, и промежуточные значения заголовка могут объединяться для экономии уведомлений об событиях.

Этот метод безопасно вызывать из любого потока.

Параметры:
title - новый заголовок

обновитьЗначение

protected void updateValue(V value)
Обновляет свойство value. Вызовы updateValue объединяются и выполняются позже в потоке FX-приложения, поэтому вызовы updateValue, даже из потока FX-приложения, не обязательно приводят к немедленному обновлению этого свойства, и промежуточные значения могут объединяться для экономии уведомлений об событиях.

Этот метод безопасно вызывать из любого потока.

Параметры:
value - новое значение
С тех пор как:
JavaFX 8.0

addEventHandler

public final <T extends Event> void addEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)
Регистрирует обработчик событий для этой задачи. Сначала обрабатываются любые фильтры событий, затем указанные обработчики событий onFoo, а затем любые обработчики событий, зарегистрированные этим методом. Как и в других событиях в дереве сцены, если событие обрабатывается, оно больше не будет распространяться.
Параметры типа:
T - конкретный класс события обработчика
Параметры:
eventType - тип событий, которые должен получить обработчик
eventHandler - регистрируемый обработчик
Исключения:
NullPointerException - если тип события или обработчик null
С тех пор как:
JavaFX 2.1

removeEventHandler

public final <T extends Event> void removeEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)
Отменяет регистрацию ранее зарегистрированного обработчика событий для этой задачи. Один обработчик может быть зарегистрирован для разных типов событий, поэтому вызывающей стороне необходимо указать конкретный тип события, для которого нужно отменить регистрацию обработчика.
Параметры типа:
T - конкретный класс события обработчика
Параметры:
eventType - тип события, для которого нужно отменить регистрацию
eventHandler - обработчик, который нужно отменить
Исключения:
NullPointerException - если тип события или обработчик null
С тех пор как:
JavaFX 2.1

addEventFilter

public final <T extends Event> void addEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)
Регистрирует фильтр событий для этой задачи. Зарегистрированные фильтры событий получают событие перед любыми связанными обработчиками событий.
Параметры типа:
T - конкретный класс события фильтра
Параметры:
eventType - тип событий, которые должен получить фильтр
eventFilter - регистрируемый фильтр
Исключения:
NullPointerException - если тип события или фильтр null
С тех пор как:
JavaFX 2.1

removeEventFilter

public final <T extends Event> void removeEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)
Отменяет регистрацию ранее зарегистрированного фильтра событий для этой задачи. Один фильтр может быть зарегистрирован для разных типов событий, поэтому вызывающей стороне необходимо указать конкретный тип события, для которого нужно отменить регистрацию фильтра.
Параметры типа:
T - конкретный класс события фильтра
Параметры:
eventType - тип события, для которого нужно отменить регистрацию
eventFilter - фильтр, который нужно отменить
Исключения:
NullPointerException - если тип события или фильтр null
С тех пор как:
JavaFX 2.1

setEventHandler

protected final <T extends Event> void setEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)
Устанавливает обработчик для этого типа события. Одновременно может быть указан только один такой обработчик. Этот обработчик гарантированно вызывается первым. Это используется для регистрации пользовательских обработчиков событий onFoo.
Параметры типа:
T - конкретный класс события обработчика
Параметры:
eventType - тип события, который нужно связать с данным eventHandler
eventHandler - регистрируемый обработчик или null для отмены регистрации
Исключения:
NullPointerException - если тип события null
С тех пор как:
JavaFX 2.1

fireEvent

public final void fireEvent(Event event)
Вызывает указанное событие. Любой встреченный фильтр событий будет уведомлён и может обработать событие. Если оно не обработано фильтрами, уведомляются обработчики событий в этой задаче. Если и они не обработают событие, вызываются все обработчики событий и могут обработать событие.

Этот метод должен вызываться в потоке FX-пользователя.

Параметры:
event - событие, которое нужно вызвать
С тех пор как:
JavaFX 2.1

© 2008, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from JavaFX API Documentation.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Java, JavaFX and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

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