Класс 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. Реализация задачи должна переопределить метод call(). Этот метод вызывается в фоновом потоке. Любое состояние, используемое в этом методе, должно быть безопасным для чтения и записи из фонового потока. Например, манипулирование живой схемой сцены из этого метода небезопасно и приведет к исключениям во время выполнения.
Задачи гибкие и чрезвычайно полезны для инкапсуляции «работы». Поскольку Service предназначен для выполнения задачи, любые задачи, определенные кодом приложения или библиотеки, могут легко использоваться с сервисом. Аналогично, поскольку Task расширяет FutureTask, очень легко и естественно использовать задачу с API конкурентности Java Executor. Поскольку Task является Runnable, его также можно вызвать напрямую (вызвав метод FutureTask.run()) из другого фонового потока. Это позволяет для композиции работы или передать её новому потоку, созданному и исполненному вручную. Наконец, поскольку вы можете вручную создать новый поток, передав ему Runnable, возможно использовать следующий фрагмент кода:
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
Обратите внимание, что этот код устанавливает флаг демона потока в значение true. Если вы хотите, чтобы фоновый поток предотвратил выход VM после закрытия последней стадии, то вам нужно установить daemon в false. Однако, если вы хотите, чтобы фоновые потоки просто завершились после закрытия всех стадий, то вы должны установить daemon в true.
Хотя ExecutorService определяет несколько методов, которые принимают Runnable, вы, как правило, должны ограничиться использованием метода execute, унаследованного от Executor.
Как и FutureTask, Task — это одноразовый класс и его нельзя повторно использовать. См. Service для повторно используемого Worker.
Поскольку Task предназначен для использования с приложениями JavaFX GUI, он гарантирует, что каждое изменение его публичных свойств, а также уведомления о состоянии, ошибках и обработчиках событий происходят в главном потоке приложения JavaFX. Доступ к этим свойствам из фонового потока (включая метод call()) приведет к возникновению исключений во время выполнения. Исключение из этого правила — первоначальная настройка задачи, которую можно безопасно выполнять из любого потока. Однако после инициализации и запуска задачи она может использоваться только из потока FX (за исключением методов, явно отмеченных как подходящие для вызова подклассом из фонового потока).
Сильно рекомендуется, чтобы все задачи инициализировались с неизменяемым состоянием, на котором будет работать задача. Это должно выполняться путём предоставления конструктора задачи, принимающего параметры, необходимые для выполнения задачи. Неизменяемое состояние упрощает и делает безопасным использование из любого потока и гарантирует корректность при работе с несколькими потоками.
В Java нет надежного способа «убить» поток в процессе. Однако, когда cancel вызывается для задачи, важно, чтобы задача прекратила обработку. «Утечка» задачи может продолжать обработку и обновление свойств сообщения, текста и прогресса даже после отмены задачи! В Java отмена задачи — это совместное действие. Пользователь задачи запросит её отмену, а автор задачи должен проверить, была ли она отменена в теле метода call. Существует два способа сделать это. Во-первых, автор задачи может проверить метод isCancelled, унаследованный от FutureTask, чтобы увидеть, была ли задача отменена. Во-вторых, если реализация задачи использует какие-либо блокирующие вызовы (такие как прерываемые NIO-каналы или Thread.sleep), а задача отменяется во время такого блокирующего вызова, выбрасывается InterruptedException. Реализации задач, которые имеют блокирующие вызовы, должны понимать, что прерванный поток может быть сигналом об отмене задачи, и должны дважды проверить метод isCancelled, чтобы убедиться, что InterruptedException был вызван из-за отмены задачи.
Примеры
Следующий набор примеров демонстрирует некоторые из наиболее распространенных способов использования задач.
Простая циклическая операция
Первый пример — это простой цикл, который не делает ничего особенно полезного, но демонстрирует основные аспекты правильного написания задачи. Этот пример просто циклирует и выводит в стандартный вывод на каждой итерации цикла. После завершения он возвращает количество итераций.
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;
}
};
Сначала мы определяем тип значения, возвращаемого этой задачей. В данном случае мы хотим вернуть количество итераций, поэтому мы укажем задачу типа Integer, используя дженерики. Затем, в реализации метода call, мы выполняем итерацию от 0 до 100000. На каждой итерации мы проверяем, была ли эта задача отменена. Если это было сделано, то мы прерываем цикл и возвращаем количество итераций. В противном случае сообщение выводится в консоль, счётчик итераций увеличивается, и мы продолжаем цикл.
Проверка isCancelled() в теле цикла имеет решающее значение, в противном случае разработчик может отменить задачу, но задача продолжит выполнение и обновление прогресса, возвращая неверный результат из конца метода call. Правильная реализация задачи всегда проверяет отмену.
Простая циклическая операция с уведомлениями о прогрессе
Аналогично предыдущему примеру, только в этот раз мы будем изменять прогресс задачи на каждой итерации. Обратите внимание, что у нас есть выбор в случае отмены. Хотим ли мы установить прогресс обратно в -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;
}
};
Как и раньше, внутри цикла мы проверяем, была ли задача отменена. Если она была отменена, мы обновим сообщение задачи, чтобы указать, что она была отменена, а затем прервём цикл, как и прежде. Если задача не была отменена, мы обновим её сообщение, чтобы указать текущую итерацию, а затем обновим прогресс, чтобы указать текущий прогресс.
Простая циклическая операция с уведомлениями о прогрессе и блокирующими вызовами
Этот пример дополняет предыдущие примеры блокирующим вызовом. Поскольку блокирующий вызов может сгенерировать InterruptedException, и поскольку InterruptedException может произойти в результате отмены задачи, нам нужно правильно обработать 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 файла для чтения. Поскольку задачи выполняются в фоновом потоке, необходимо позаботиться о том, чтобы тело метода call не считывало и не изменяло общее состояние. Есть два наиболее полезных приёма для этого: использование конечных переменных и передача переменных задаче во время её создания.
При использовании задачи в виде анонимного класса наиболее естественный способ передачи параметров задаче — использование конечных переменных. В этом примере мы передаём задаче общее количество итераций, которые она должна выполнить.
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 является конечным, метод call может безопасно его читать и ссылаться на него из фонового потока.
При написании библиотек задач (в отличие от конкретных реализаций), нам нужен другой приём. В этом случае я создам IteratingTask, которая выполняет ту же работу, что и выше. На этот раз, поскольку IteratingTask определена в отдельном файле, ей необходимо будет передать параметры в её конструктор. Эти параметры присваиваются конечным переменным.
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 безопасным способом, и опять же, являются конечными. Таким образом, метод call может безопасно читать это состояние из фонового потока.
ПРЕДУПРЕЖДЕНИЕ: Не передавайте изменяемое состояние задаче и не работайте с ним из фонового потока. Это может привести к возникновению гонок. В частности, предположим, что у вас есть SaveCustomerTask, который принимает Customer в своём конструкторе. Хотя SaveCustomerTask может иметь конечную ссылку на Customer, если объект Customer изменяемый, то существует возможность, что как SaveCustomerTask, так и некоторый другой код приложения будут считывать или изменять состояние Customer из разных потоков. Будьте очень внимательны в таких случаях, что, в то время как изменяемый объект, такой как Customer, используется из фонового потока, он не используется также из другого потока. В частности, если фоновый поток считывает данные из базы данных и обновляет объект Customer, а объект Customer связан с узлами схемы сцены (такими как элементы управления UI), то это может нарушить правила потоков! В таких случаях изменяйте объект 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;
}
}
Задача, не возвращающая значение
Многие, если не большинство, задач должны возвращать значение по завершении. Для задач 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 и другие элементы пользовательского интерфейса и узлы дерева сцены используют 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!");
}
};
- Since:
- JavaFX 2.0
Краткое описание свойств
| Тип | Свойство | Описание |
|---|---|---|
final ReadOnlyObjectProperty<Throwable> |
exception |
Получает ReadOnlyObjectProperty, представляющую любую произошедшую ошибку. |
final ReadOnlyStringProperty |
message |
Получает ReadOnlyStringProperty, представляющую сообщение. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onCancelled |
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в CANCELLED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onFailed |
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в FAILED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onRunning |
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в RUNNING. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onScheduled |
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в SCHEDULED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onSucceeded |
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в SUCCEEDED. |
final ReadOnlyDoubleProperty |
progress |
Получает ReadOnlyDoubleProperty, представляющую прогресс. |
final ReadOnlyBooleanProperty |
running |
Получает ReadOnlyBooleanProperty, представляющую, работает ли Worker. |
final ReadOnlyObjectProperty<Worker.State> |
state |
Получает ReadOnlyObjectProperty, представляющую текущее состояние. |
final ReadOnlyStringProperty |
title |
Получает ReadOnlyStringProperty, представляющую заголовок. |
final ReadOnlyDoubleProperty |
totalWork |
Получает ReadOnlyDoubleProperty, представляющую максимальное количество работы, которое необходимо выполнить. |
final ReadOnlyObjectProperty<V> |
value |
Получает ReadOnlyObjectProperty, представляющую значение. |
final ReadOnlyDoubleProperty |
workDone |
Получает ReadOnlyDoubleProperty, представляющую текущий прогресс. |
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в интерфейсе java.util.concurrent.Future
Future.State
Вложенные классы/интерфейсы, объявленные в интерфейсе javafx.concurrent.Worker
Worker.State
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Task() |
Создаёт новую задачу. |
Краткое описание методов
| Modifier and Type | Method | Description |
|---|---|---|
final <T extends Event> |
addEventFilter |
Регистрирует фильтр событий для этого целевого объекта. |
final <T extends Event> |
addEventHandler |
Регистрирует обработчик событий для этого целевого объекта. |
EventDispatchChain |
buildEventDispatchChain |
Создаёт цепочку обработки событий для этого целевого объекта. |
protected abstract V |
call() |
Вызывается при выполнении задачи; метод вызова необходимо переопределить и реализовать в подклассах. |
final boolean |
cancel() |
Завершает выполнение этого обработчика. |
protected void |
cancelled() |
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние CANCELLED. |
final ReadOnlyObjectProperty<Throwable> |
exceptionProperty() |
Возвращает ReadOnlyObjectProperty, представляющий любую произошедшую ошибку. |
protected void |
failed() |
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние FAILED. |
final void |
fireEvent |
Вызывает указанное событие. |
final Throwable |
getException() |
Возвращает значение свойства exception. |
final String |
getMessage() |
Возвращает значение свойства message. |
final EventHandler<WorkerStateEvent> |
getOnCancelled() |
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED. |
final EventHandler<WorkerStateEvent> |
getOnFailed() |
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED. |
final EventHandler<WorkerStateEvent> |
getOnRunning() |
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING. |
final EventHandler<WorkerStateEvent> |
getOnScheduled() |
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED. |
final EventHandler<WorkerStateEvent> |
getOnSucceeded() |
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. |
final double |
getProgress() |
Возвращает значение свойства progress. |
final Worker.State |
getState() |
Возвращает значение свойства state. |
final String |
getTitle() |
Возвращает значение свойства title. |
final double |
getTotalWork() |
Возвращает значение свойства totalWork. |
final V |
getValue() |
Возвращает значение свойства value. |
final double |
getWorkDone() |
Возвращает значение свойства workDone. |
final boolean |
isRunning() |
Возвращает значение свойства running. |
final ReadOnlyStringProperty |
messageProperty() |
Возвращает ReadOnlyStringProperty, представляющий сообщение. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onCancelledProperty() |
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onFailedProperty() |
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onRunningProperty() |
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onScheduledProperty() |
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED. |
final ObjectProperty<EventHandler<WorkerStateEvent>> |
onSucceededProperty() |
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. |
final ReadOnlyDoubleProperty |
progressProperty() |
Возвращает ReadOnlyDoubleProperty, представляющий прогресс. |
final <T extends Event> |
removeEventFilter |
Отменяет ранее зарегистрированный фильтр событий от этого целевого объекта. |
final <T extends Event> |
removeEventHandler |
Отменяет ранее зарегистрированный обработчик событий от этого целевого объекта. |
protected void |
running() |
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние RUNNING. |
final ReadOnlyBooleanProperty |
runningProperty() |
Возвращает ReadOnlyBooleanProperty, указывающее, запущен ли обработчик. |
protected void |
scheduled() |
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SCHEDULED. |
protected final <T extends Event> |
setEventHandler |
Устанавливает обработчик для этого типа события. |
final void |
setOnCancelled |
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED. |
final void |
setOnFailed |
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED. |
final void |
setOnRunning |
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING. |
final void |
setOnScheduled |
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED. |
final void |
setOnSucceeded |
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. |
final ReadOnlyObjectProperty<Worker.State> |
stateProperty() |
Возвращает ReadOnlyObjectProperty, представляющий текущее состояние. |
protected void |
succeeded() |
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. |
final ReadOnlyStringProperty |
titleProperty() |
Возвращает ReadOnlyStringProperty, представляющий заголовок. |
final ReadOnlyDoubleProperty |
totalWorkProperty() |
Возвращает ReadOnlyDoubleProperty, представляющий максимальное количество работы, которое необходимо выполнить. |
protected void |
updateMessage |
Обновляет свойство message. |
protected void |
updateProgress |
Обновляет свойства workDone, totalWork и progress. |
protected void |
updateProgress |
Обновляет свойства workDone, totalWork и progress. |
protected void |
updateTitle |
Обновляет свойство title. |
protected void |
updateValue |
Обновляет свойство value. |
final ReadOnlyObjectProperty<V> |
valueProperty() |
Возвращает ReadOnlyObjectProperty, представляющий значение. |
final ReadOnlyDoubleProperty |
workDoneProperty() |
Возвращает ReadOnlyDoubleProperty, представляющий текущий прогресс. |
Методы, объявленные в классе java.util.concurrent.FutureTask
cancel, done, exceptionNow, get, get, isCancelled, isDone, resultNow, run, runAndReset, set, setException, state, toString
Подробности свойств
состояние
public final ReadOnlyObjectProperty<Worker.State> stateProperty
- Определено:
-
statePropertyв интерфейсеWorker<V> - Возвращает:
- Свойство, представляющее состояние
- См. также:
onScheduled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty
- С:
- JavaFX 2.1
- См. также:
onRunning
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty
- С:
- JavaFX 2.1
- См. также:
onSucceeded
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty
- С:
- JavaFX 2.1
- См. также:
onCancelled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty
- С:
- JavaFX 2.1
- См. также:
onFailed
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty
- С:
- JavaFX 2.1
- См. также:
значение
public final ReadOnlyObjectProperty<V> valueProperty
- Определено:
-
valuePropertyв интерфейсеWorker<V> - Возвращает:
- Свойство, представляющее текущее значение
- См. также:
исключение
public final ReadOnlyObjectProperty<Throwable> exceptionProperty
- Определено:
-
exceptionPropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее исключение
- См. также:
проделанная работа
public final ReadOnlyDoubleProperty workDoneProperty
- Определено:
-
workDonePropertyв интерфейсеWorker<V> - Возвращает:
- Свойство, представляющее количество проделанной работы
- См. также:
общая работа
public final ReadOnlyDoubleProperty totalWorkProperty
- Определено:
-
totalWorkPropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее общую работу
- См. также:
прогресс
public final ReadOnlyDoubleProperty progressProperty
- Определено:
-
progressPropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее прогресс
- См. также:
работает
public final ReadOnlyBooleanProperty runningProperty
- Определено:
-
runningPropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее, работает ли рабочий процесс
- См. также:
сообщение
public final ReadOnlyStringProperty messageProperty
- Определено:
-
messagePropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее текущее сообщение
- См. также:
заголовок
public final ReadOnlyStringProperty titleProperty
- Определено:
-
titlePropertyв интерфейсеWorker<V> - Возвращает:
- свойство, представляющее текущий заголовок
- См. также:
Подробности конструкторов
Задача
public Task()
Подробности методов
вызов
protected abstract V call() throws Exception
- Возвращает:
- Результат фоновой работы, если таковой имеется.
- Исключение:
-
Exception- необработанное исключение, возникшее во время фоновой операции
получитьСостояние
public final Worker.State getState()
state.- Определено:
-
getStateв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
state - См. также:
stateProperty
public final ReadOnlyObjectProperty<Worker.State> stateProperty()
Worker- Определено:
-
statePropertyв интерфейсеWorker<V> - Возвращает:
- свойство
state - См. также:
onScheduledProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty()
- Возвращает:
- свойство обработчика событий onScheduled
- С:
- JavaFX 2.1
- См. также:
getOnScheduled
public final EventHandler<WorkerStateEvent> getOnScheduled()
- Возвращает:
- обработчик событий onScheduled, если таковой имеется
- С:
- JavaFX 2.1
setOnScheduled
public final void setOnScheduled(EventHandler<WorkerStateEvent> value)
- Параметры:
-
value- обработчик событий, может быть null для очистки - С:
- JavaFX 2.1
scheduled
protected void scheduled()
- С:
- JavaFX 2.1
onRunningProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty()
- Возвращает:
- свойство обработчика событий onRunning
- С:
- JavaFX 2.1
- См. также:
getOnRunning
public final EventHandler<WorkerStateEvent> getOnRunning()
- Возвращает:
- обработчик события onRunning, если таковой есть
- С:
- JavaFX 2.1
setOnRunning
public final void setOnRunning(EventHandler<WorkerStateEvent> value)
- Параметры:
-
value— обработчик событий, может быть null для его очистки - С:
- JavaFX 2.1
running
protected void running()
- С:
- JavaFX 2.1
onSucceededProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty()
- Возвращает:
- свойство обработчика событий onSucceeded
- С:
- JavaFX 2.1
- См. также:
getOnSucceeded
public final EventHandler<WorkerStateEvent> getOnSucceeded()
- Возвращает:
- обработчик события onSucceeded, если таковой есть
- С:
- JavaFX 2.1
setOnSucceeded
public final void setOnSucceeded(EventHandler<WorkerStateEvent> value)
- Параметры:
-
value— обработчик событий, может быть null для его очистки - С:
- JavaFX 2.1
succeeded
protected void succeeded()
- С:
- JavaFX 2.1
onCancelledProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty()
- Возвращает:
- свойство обработчика событий onCancelled
- С:
- JavaFX 2.1
- См. также:
getOnCancelled
public final EventHandler<WorkerStateEvent> getOnCancelled()
- Возвращает:
- обработчик события onCancelled, если таковой есть
- С:
- JavaFX 2.1
setOnCancelled
public final void setOnCancelled(EventHandler<WorkerStateEvent> value)
- Параметры:
-
value— обработчик событий, может быть null для его очистки - С:
- JavaFX 2.1
cancelled
protected void cancelled()
- С:
- JavaFX 2.1
onFailedProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty()
- Возвращает:
- свойство обработчика событий onFailed
- С:
- JavaFX 2.1
- См. также:
getOnFailed
public final EventHandler<WorkerStateEvent> getOnFailed()
- Возвращает:
- обработчик события onFailed, если таковой есть
- С:
- JavaFX 2.1
setOnFailed
public final void setOnFailed(EventHandler<WorkerStateEvent> value)
- Параметры:
-
value— обработчик событий, может быть null для его очистки - С:
- JavaFX 2.1
failed
protected void failed()
- С:
- JavaFX 2.1
getValue
public final V getValue()
value.- Определено в:
-
getValueв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
value - См. также:
valueProperty
public final ReadOnlyObjectProperty<V> valueProperty()
Worker- Определено в:
-
valuePropertyв интерфейсеWorker<V> - Возвращает:
- свойство
value - См. также:
getException
public final Throwable getException()
exception.- Определено в:
-
getExceptionв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
exception - См. также:
exceptionProperty
public final ReadOnlyObjectProperty<Throwable> exceptionProperty()
Worker- Определено в:
-
exceptionPropertyв интерфейсеWorker<V> - Возвращает:
- свойство
exception - См. также:
getWorkDone
public final double getWorkDone()
workDone.- Определено в:
-
getWorkDoneв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
workDone - См. также:
workDoneProperty
public final ReadOnlyDoubleProperty workDoneProperty()
Worker- Определено в:
-
workDonePropertyв интерфейсеWorker<V> - Возвращает:
- свойство
workDone - См. также:
getTotalWork
public final double getTotalWork()
totalWork.- Определено в:
-
getTotalWorkв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
totalWork - См. также:
totalWorkProperty
public final ReadOnlyDoubleProperty totalWorkProperty()
Worker- Определено в:
-
totalWorkPropertyв интерфейсеWorker<V> - Возвращает:
- свойство
totalWork - См. также:
getProgress
public final double getProgress()
progress.- Определено в:
-
getProgressв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
progress - См. также:
progressProperty
public final ReadOnlyDoubleProperty progressProperty()
Worker- Определено в:
-
progressPropertyв интерфейсеWorker<V> - Возвращает:
- свойство
progress - См. также:
isRunning
public final boolean isRunning()
running.- Определено в:
-
isRunningв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
running - См. также:
runningProperty
public final ReadOnlyBooleanProperty runningProperty()
Worker- Определено в:
-
runningPropertyв интерфейсеWorker<V> - Возвращает:
- свойство
running - См. также:
getMessage
public final String getMessage()
message.- Определено в:
-
getMessageв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
message - См. также:
messageProperty
public final ReadOnlyStringProperty messageProperty()
Worker- Определено в:
-
messagePropertyв интерфейсеWorker<V> - Возвращает:
- свойство
message - См. также:
getTitle
public final String getTitle()
title.- Определено в:
-
getTitleв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- значение свойства
title - См. также:
titleProperty
public final ReadOnlyStringProperty titleProperty()
Worker- Определено в:
-
titlePropertyв интерфейсеWorker<V> - Возвращает:
- свойство
title - См. также:
cancel
public final boolean cancel()
Worker- Определено в:
-
cancelв интерфейсеWorker<V> - Возвращает:
- возвращает true, если отмена прошла успешно
updateProgress
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
protected void updateProgress(double workDone, double max)
workDone, totalWork и progress. Вызовы updateProgress объединяются и выполняются позже в потоке FX-приложения, и вызовы updateProgress, даже из потока FX-приложения, могут не привести к немедленным обновлениям этих свойств, и промежуточные значения workDone могут объединяться, чтобы сократить количество уведомлений об событиях. max становится новым значением для totalWork. Этот метод безопасно вызывать из любого потока.
- Параметры:
-
workDone- Значение от Double.MIN_VALUE до max. Если значение больше max, оно будет ограничено max. Если переданное значение отрицательное, или бесконечность, или NaN, то результирующий percentDone будет -1 (следовательно, неопределённый). -
max- Значение от Double.MIN_VALUE до Double.MAX_VALUE. Бесконечность и NaN обрабатываются как -1. - С:
- JavaFX 2.2
updateMessage
protected void updateMessage(String message)
message. Вызовы updateMessage объединяются и выполняются позже в потоке FX-приложения, поэтому вызовы updateMessage, даже из потока FX-приложения, могут не привести к немедленным обновлениям этого свойства, и промежуточные значения сообщений могут объединяться, чтобы сократить количество уведомлений об событиях. Этот метод безопасно вызывать из любого потока.
- Параметры:
-
message- новое сообщение
updateTitle
protected void updateTitle(String title)
title. Вызовы updateTitle объединяются и выполняются позже в потоке FX-приложения, поэтому вызовы updateTitle, даже из потока FX-приложения, могут не привести к немедленным обновлениям этого свойства, и промежуточные значения заголовков могут объединяться, чтобы сократить количество уведомлений об событиях. Этот метод безопасно вызывать из любого потока.
- Параметры:
-
title- новый заголовок
updateValue
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)
Обработчик вызывается, когда целевой объект получает Event указанного типа во время фазы всплытия доставки события.
- Определено в:
-
addEventHandlerв интерфейсеEventTarget - Типы параметров:
-
T- класс события для обработчика - Параметры:
-
eventType- тип событий, получаемых обработчиком -
eventHandler- обработчик событий - С:
- JavaFX 2.1
removeEventHandler
public final <T extends Event> void removeEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)
Поскольку возможно зарегистрировать единственный экземпляр EventHandler для различных типов событий, вызывающий метод должен указать тип события, из которого необходимо удалить обработчик.
- Specified by:
-
removeEventHandlerв интерфейсеEventTarget - Type Parameters:
-
T- класс события обработчика - Parameters:
-
eventType- тип события, из которого нужно удалить обработчик -
eventHandler- обработчик событий - Since:
- JavaFX 2.1
addEventFilter
public final <T extends Event> void addEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)
Фильтр вызывается, когда объект получает Event указанного типа во время фазы захвата доставки события.
- Specified by:
-
addEventFilterв интерфейсеEventTarget - Type Parameters:
-
T- класс события фильтра - Parameters:
-
eventType- тип событий, получаемых фильтром -
eventFilter- фильтр событий - Since:
- JavaFX 2.1
removeEventFilter
public final <T extends Event> void removeEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)
Поскольку возможно зарегистрировать один экземпляр EventHandler для разных типов событий, вызывающий метод должен указать тип события, из которого нужно удалить фильтр.
- Specified by:
-
removeEventFilterв интерфейсеEventTarget - Type Parameters:
-
T- класс события фильтра - Parameters:
-
eventType- тип события, из которого нужно удалить фильтр -
eventFilter- фильтр событий - Since:
- JavaFX 2.1
setEventHandler
protected final <T extends Event> void setEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)
- Type Parameters:
-
T- конкретный класс события обработчика - Parameters:
-
eventType- тип события, который нужно связать с заданным eventHandler -
eventHandler- обработчик для регистрации, или null для отмены регистрации - Throws:
-
NullPointerException- если тип события null - Since:
- JavaFX 2.1
fireEvent
public final void fireEvent(Event event)
Этот метод должен вызываться на потоке FX пользовательского интерфейса.
- Parameters:
-
event- событие для вызова - Since:
- JavaFX 2.1
buildEventDispatchChain
public EventDispatchChain buildEventDispatchChain(EventDispatchChain tail)
EventTargetEventTarget. Этот объект-цель события не добавляется в цепочку автоматически, поэтому, если он хочет обрабатывать события, ему нужно добавить в цепочку свой EventDispatcher. В случае, если объект-цель события является частью иерархии, цепочка для него обычно строится из диспетчеров событий, собранных от корня иерархии до объекта-цели.
Цепочка обработки событий строится путем модификации предоставленной начальной цепочки обработки событий. Возвращаемая цепочка должна иметь начальную цепочку в конце, поэтому диспетчеры должны быть добавлены в начало начальной цепочки.
Вызывающий метод не должен предполагать, что начальная цепочка остается неизменной, или что возвращаемое значение будет ссылаться на другую цепочку.
- Specified by:
-
buildEventDispatchChainв интерфейсеEventTarget - Parameters:
-
tail- начальная цепочка для построения - Returns:
- результирующая цепочка обработки событий для этого объекта
© 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.