Класс Task<V>
- 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. Задачи предоставляют дополнительное состояние и наблюдаемые свойства, полезные для программирования асинхронных задач в 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.
Поскольку задача предназначена для использования с приложениями JavaFX GUI, она гарантирует, что каждое изменение ее общедоступных свойств, а также уведомления о состоянии, ошибках и обработчиках событий происходят в основном потоке приложения JavaFX. Обращение к этим свойствам из фонового потока (включая метод call()) приведет к возникновению исключений во время выполнения. Единственное исключение из этого правила — начальная настройка задачи, которую безопасно выполнять из любого потока. Однако после инициализации и запуска задачи она может использоваться только из потока FX (за исключением тех методов, которые явно помечены как подходящие для вызова подклассом из фонового потока).
Настоятельно рекомендуется, чтобы все задачи инициализировались с неизменяемым состоянием, на котором будет выполняться задача. Это следует делать, предоставляя конструктор задачи, который принимает параметры, необходимые для выполнения задачи. Неизменяемое состояние упрощает и повышает безопасность использования из любого потока и гарантирует корректность при наличии нескольких потоков.
В Java нет надежного способа "убить" поток в процессе. Однако когда cancel вызывается на задаче, важно, чтобы задача прекратила обработку. "Бегущая" задача может продолжать обработку и обновление свойств сообщения, текста и прогресса даже после отмены задачи! В Java отмена задачи — это совместное усилие. Пользователь задачи запросит её отмену, и автор задачи должен проверить, была ли она отменена внутри тела метода call. Это можно сделать двумя способами. Во-первых, автор задачи может проверить метод isCancelled, унаследованный от FutureTask, чтобы увидеть, была ли отменена задача. Во-вторых, если реализация задачи использует какие-либо блокирующие вызовы (например, NIO InterruptibleChannels или 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;
}
}; Как и прежде, внутри цикла for мы проверяем, была ли задача отменена. Если это так, мы обновим сообщение задачи, чтобы указать, что она отменена, и прервемся, как и раньше. Если задача не была отменена, мы обновим ее сообщение, чтобы указать текущую итерацию, а затем обновим прогресс, чтобы указать текущий прогресс.
Простой цикл с уведомлениями о прогрессе и блокирующими вызовами
Этот пример добавляет к предыдущим примерам блокирующий вызов. Поскольку блокирующий вызов может вызвать исключение 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.setF 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 и другие элементы управления 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> partialResults =
new ReadOnlyObjectWrapper<>(this, "partialResults",
FXCollections.observableArrayList(new ArrayList()));
public final ObservableList getPartialResults() { return partialResults.get(); }
public final ReadOnlyObjectProperty> partialResultsProperty() {
return partialResults.getReadOnlyProperty();
}
@Override protected ObservableList 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
-
Сводка свойств
Все методыМетоды экземпляровКонкретные методы Тип Свойство и описание ReadOnlyObjectProperty<Throwable>exceptionПолучает ReadOnlyObjectProperty, представляющее любую произошедшую ошибку.ReadOnlyStringPropertymessageПолучает ReadOnlyStringProperty, представляющую сообщение.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.ReadOnlyDoublePropertyprogressПолучает ReadOnlyDoubleProperty, представляющую прогресс.ReadOnlyBooleanPropertyrunningПолучает ReadOnlyBooleanProperty, представляющую, выполняется ли Worker.ReadOnlyObjectProperty<Worker.State>stateПолучает ReadOnlyObjectProperty, представляющее текущее состояние.ReadOnlyStringPropertytitleПолучает ReadOnlyStringProperty, представляющую заголовок.ReadOnlyDoublePropertytotalWorkПолучает ReadOnlyDoubleProperty, представляющую максимальное количество выполняемой работы.ReadOnlyObjectProperty<V>valueПолучает ReadOnlyObjectProperty, представляющее значение.ReadOnlyDoublePropertyworkDoneПолучает ReadOnlyDoubleProperty, представляющую текущий прогресс.
-
Сводка вложенных классов
-
Вложенные классы/интерфейсы, унаследованные от интерфейса javafx.concurrent.Worker
Worker.State
-
-
Сводка конструкторов
Конструкторы Конструктор и описание Task()Создает новую задачу.
-
Краткое описание методов
Все методыМетоды экземпляраАбстрактные методыКонкретные методы Модификатор и тип Метод и описание <T extends Event>
voidaddEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)Регистрирует фильтр событий для этой задачи.<T extends Event>
voidaddEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)Регистрирует обработчик событий для этой задачи.EventDispatchChainbuildEventDispatchChain(EventDispatchChain tail)Создаёт цепочку обработки событий для этой цели.protected abstract Vcall()Вызывается при выполнении задачи, метод вызова должен быть переопределён и реализован подклассами.booleancancel()Прерывает выполнение этой рабочей задачи.booleancancel(boolean mayInterruptIfRunning)protected voidcancelled()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние CANCELLED.ReadOnlyObjectProperty<Throwable>exceptionProperty()Возвращает ReadOnlyObjectProperty, представляющую любую произошедшую ошибку.protected voidfailed()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние FAILED.voidfireEvent(Event event)Срабатывает указанное событие.ThrowablegetException()Возвращает значение свойства exception.StringgetMessage()Возвращает значение свойства message.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.doublegetProgress()Возвращает значение свойства progress.Worker.StategetState()Возвращает значение свойства state.StringgetTitle()Возвращает значение свойства title.doublegetTotalWork()Возвращает значение свойства totalWork.VgetValue()Возвращает значение свойства value.doublegetWorkDone()Возвращает значение свойства workDone.booleanisRunning()Возвращает значение свойства running.ReadOnlyStringPropertymessageProperty()Возвращает ReadOnlyStringProperty, представляющую сообщение.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.ReadOnlyDoublePropertyprogressProperty()Возвращает ReadOnlyDoubleProperty, представляющую прогресс.<T extends Event>
voidremoveEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)Отменяет ранее зарегистрированный фильтр событий для этой задачи.<T extends Event>
voidremoveEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)Отменяет ранее зарегистрированный обработчик событий для этой задачи.protected voidrunning()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние RUNNING.ReadOnlyBooleanPropertyrunningProperty()Возвращает ReadOnlyBooleanProperty, представляющую, работает ли рабочая задача.protected voidscheduled()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SCHEDULED.protected <T extends Event>
voidsetEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)Устанавливает обработчик для этого типа событий.voidsetOnCancelled(EventHandler<WorkerStateEvent> value)Обработчик события onCancelled вызывается всякий раз, когда состояние задачи изменяется на CANCELLED.voidsetOnFailed(EventHandler<WorkerStateEvent> value)Обработчик события onFailed вызывается всякий раз, когда состояние задачи изменяется на FAILED.voidsetOnRunning(EventHandler<WorkerStateEvent> value)Обработчик события onRunning вызывается всякий раз, когда состояние задачи изменяется на RUNNING.voidsetOnScheduled(EventHandler<WorkerStateEvent> value)Обработчик события onSchedule вызывается всякий раз, когда состояние задачи изменяется на SCHEDULED.voidsetOnSucceeded(EventHandler<WorkerStateEvent> value)Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи изменяется на SUCCEEDED.ReadOnlyObjectProperty<Worker.State>stateProperty()Возвращает ReadOnlyObjectProperty, представляющую текущее состояние.protected voidsucceeded()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.ReadOnlyStringPropertytitleProperty()Возвращает ReadOnlyStringProperty, представляющую заголовок.ReadOnlyDoublePropertytotalWorkProperty()Возвращает ReadOnlyDoubleProperty, представляющую максимальное количество работы, которое необходимо выполнить.protected voidupdateMessage(String message)Обновляет свойствоmessage.protected voidupdateProgress(double workDone, double max)Обновляет свойстваworkDone,totalWorkиprogress.protected voidupdateProgress(long workDone, long max)Обновляет свойстваworkDone,totalWorkиprogress.protected voidupdateTitle(String title)Обновляет свойствоtitle.protected voidupdateValue(V value)Обновляет свойствоvalue.ReadOnlyObjectProperty<V>valueProperty()Возвращает ReadOnlyObjectProperty, представляющую значение.ReadOnlyDoublePropertyworkDoneProperty()Возвращает ReadOnlyDoubleProperty, представляющую текущий прогресс.-
Методы, унаследованные от класса java.util.concurrent.FutureTask
done, get, get, isCancelled, isDone, run, runAndReset, set, setException
-
-
Подробное описание свойства
-
состояние
public final ReadOnlyObjectProperty<Worker.State> stateProperty
Определено:
statePropertyв интерфейсеWorker<V>Возвращает:
Свойство, представляющее состояние
См. также:
-
onScheduled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.С:
JavaFX 2.1
См. также:
-
onRunning
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.С:
JavaFX 2.1
См. также:
-
onSucceeded
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.С:
JavaFX 2.1
См. также:
-
onCancelled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.С:
JavaFX 2.1
См. также:
-
onFailed
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.С:
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()
Создает новую задачу.
-
-
Method Detail
-
call
protected abstract V call() throws ExceptionВызывается при выполнении задачи, метод call должен быть переопределен и реализован подклассами. Метод call фактически выполняет логику фонового потока. Только методы updateProgress, updateMessage, updateValue и updateTitle класса Task могут быть вызваны из кода в этом методе. Любое другое взаимодействие с Task из фонового потока приведет к исключениям во время выполнения.Возвращает:
Результат фоновой работы, если таковой имеется.
Выбрасывает:
Exception- необработанное исключение, которое произошло во время фоновой операции
-
getState
public final Worker.State getState()
Получает значение свойства state.
-
stateProperty
public final ReadOnlyObjectProperty<Worker.State> stateProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyObjectProperty, представляющее текущее состояние.Определено в:
statePropertyв интерфейсеWorker<V>Возвращает:
Свойство, представляющее состояние
См. также:
-
onScheduledProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty()
Обработчик события onSchedule вызывается всякий раз, когда состояние Task переходит в состояние SCHEDULED.Начиная с:
JavaFX 2.1
См. также:
-
getOnScheduled
public final EventHandler<WorkerStateEvent> getOnScheduled()
Обработчик события onSchedule вызывается всякий раз, когда состояние Task переходит в состояние SCHEDULED.Возвращает:
Обработчик событий onScheduled, если он существует
Начиная с:
JavaFX 2.1
-
setOnScheduled
public final void setOnScheduled(EventHandler<WorkerStateEvent> value)
Обработчик события onSchedule вызывается всякий раз, когда состояние Task переходит в состояние SCHEDULED.Параметры:
value- обработчик событий, может быть равен null, чтобы очистить егоНачиная с:
JavaFX 2.1
-
scheduled
protected void scheduled()
Удобный защищенный метод для подклассов, вызываемый всякий раз, когда состояние Task перешло в состояние SCHEDULED. Этот метод вызывается в потоке приложения FX после того, как Task полностью перешел в новое состояние.Начиная с:
JavaFX 2.1
-
onRunningProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty()
Обработчик события onRunning вызывается всякий раз, когда состояние Task переходит в состояние RUNNING.Начиная с:
JavaFX 2.1
См. также:
-
getOnRunning
public final EventHandler<WorkerStateEvent> getOnRunning()
Обработчик события onRunning вызывается всякий раз, когда состояние Task переходит в состояние RUNNING.Возвращает:
Обработчик событий onRunning, если он существует
Начиная с:
JavaFX 2.1
-
setOnRunning
public final void setOnRunning(EventHandler<WorkerStateEvent> value)
Обработчик события onRunning вызывается всякий раз, когда состояние Task переходит в состояние RUNNING.Параметры:
value- обработчик событий, может быть равен null, чтобы очистить егоНачиная с:
JavaFX 2.1
-
running
protected void running()
Удобный защищенный метод для подклассов, вызываемый всякий раз, когда состояние Task перешло в состояние RUNNING. Этот метод вызывается в потоке приложения FX после того, как Task полностью перешел в новое состояние.Начиная с:
JavaFX 2.1
-
onSucceededProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty()
Обработчик события onSucceeded вызывается всякий раз, когда состояние Task переходит в состояние SUCCEEDED.Начиная с:
JavaFX 2.1
См. также:
-
getOnSucceeded
public final EventHandler<WorkerStateEvent> getOnSucceeded()
Обработчик события onSucceeded вызывается всякий раз, когда состояние Task переходит в состояние SUCCEEDED.Возвращает:
Обработчик событий onSucceeded, если он существует
Начиная с:
JavaFX 2.1
-
setOnSucceeded
public final void setOnSucceeded(EventHandler<WorkerStateEvent> value)
Обработчик события onSucceeded вызывается всякий раз, когда состояние Task переходит в состояние SUCCEEDED.Параметры:
value- обработчик событий, может быть равен null, чтобы очистить егоНачиная с:
JavaFX 2.1
-
succeeded
protected void succeeded()
Удобный защищенный метод для подклассов, вызываемый всякий раз, когда состояние Task перешло в состояние SUCCEEDED. Этот метод вызывается в потоке приложения FX после того, как Task полностью перешел в новое состояние.Начиная с:
JavaFX 2.1
-
onCancelledProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty()
Обработчик события onCancelled вызывается всякий раз, когда состояние Task переходит в состояние CANCELLED.Начиная с:
JavaFX 2.1
См. также:
-
getOnCancelled
public final EventHandler<WorkerStateEvent> getOnCancelled()
Обработчик события onCancelled вызывается всякий раз, когда состояние Task переходит в состояние CANCELLED.Возвращает:
Обработчик событий onCancelled, если он существует
Начиная с:
JavaFX 2.1
-
setOnCancelled
public final void setOnCancelled(EventHandler<WorkerStateEvent> value)
Обработчик события onCancelled вызывается всякий раз, когда состояние Task переходит в состояние CANCELLED.Параметры:
value- обработчик событий, может быть равен null, чтобы очистить егоНачиная с:
JavaFX 2.1
-
cancelled
protected void cancelled()
Удобный защищенный метод для подклассов, вызываемый всякий раз, когда состояние Task перешло в состояние CANCELLED. Этот метод вызывается в потоке приложения FX после того, как Task полностью перешел в новое состояние.Начиная с:
JavaFX 2.1
-
onFailedProperty
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty()
Обработчик события onFailed вызывается всякий раз, когда состояние Task переходит в состояние FAILED.Начиная с:
JavaFX 2.1
См. также:
-
getOnFailed
public final EventHandler<WorkerStateEvent> getOnFailed()
Обработчик события onFailed вызывается всякий раз, когда состояние Task переходит в состояние FAILED.Возвращает:
Обработчик событий onFailed, если он существует
Начиная с:
JavaFX 2.1
-
setOnFailed
public final void setOnFailed(EventHandler<WorkerStateEvent> value)
Обработчик события onFailed вызывается всякий раз, когда состояние Task переходит в состояние FAILED.Параметры:
value- обработчик событий, может быть равен null, чтобы очистить егоНачиная с:
JavaFX 2.1
-
failed
protected void failed()
Удобный защищенный метод для подклассов, вызываемый всякий раз, когда состояние Task перешло в состояние FAILED. Этот метод вызывается в потоке приложения FX после того, как Task полностью перешел в новое состояние.Начиная с:
JavaFX 2.1
-
getValue
public final V getValue()
Получает значение свойства value.
-
valueProperty
public final ReadOnlyObjectProperty<V> valueProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyObjectProperty, представляющее значение.Определено в:
valuePropertyв интерфейсеWorker<V>Возвращает:
Свойство, представляющее текущее значение
См. также:
-
getException
public final Throwable getException()
Получает значение свойства exception.Определено в:
getExceptionв интерфейсеWorker<V>Возвращает:
Исключение, если оно произошло
-
exceptionProperty
public final ReadOnlyObjectProperty<Throwable> exceptionProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyObjectProperty, представляющее любое произошедшее исключение.Определено в:
exceptionPropertyв интерфейсеWorker<V>Возвращает:
Свойство, представляющее исключение
См. также:
-
getWorkDone
public final double getWorkDone()
Получает значение свойства workDone.
-
-
workDoneProperty
public final ReadOnlyDoubleProperty workDoneProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyDoubleProperty, представляющий текущую степень выполнения.Определено в:
workDonePropertyв интерфейсеWorker<V>Возвращает:
Свойство, представляющее объем выполненной работы
См. также:
-
getTotalWork
public final double getTotalWork()
Получает значение свойства totalWork.
-
totalWorkProperty
public final ReadOnlyDoubleProperty totalWorkProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyDoubleProperty, представляющий максимальный объем работы, который необходимо выполнить. Эти «единицы работы» имеют значение для реализации Worker, например, количество байтов, которые необходимо загрузить, количество изображений для обработки или какой-либо другой метрики.Определено в:
totalWorkPropertyв интерфейсеWorker<V>Возвращает:
свойство, представляющее общий объем работы
См. также:
-
getProgress
public final double getProgress()
Получает значение свойства progress.
-
progressProperty
public final ReadOnlyDoubleProperty progressProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyDoubleProperty, представляющий степень выполнения.Определено в:
progressPropertyв интерфейсеWorker<V>Возвращает:
свойство, представляющее степень выполнения
См. также:
-
isRunning
public final boolean isRunning()
Получает значение свойства running.
-
runningProperty
public final ReadOnlyBooleanProperty runningProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyBooleanProperty, представляющий, выполняется ли Worker.Определено в:
runningPropertyв интерфейсеWorker<V>Возвращает:
свойство, представляющее, выполняется ли worker
См. также:
-
getMessage
public final String getMessage()
Получает значение свойства message.Определено в:
getMessageв интерфейсеWorker<V>Возвращает:
текущее сообщение
-
messageProperty
public final ReadOnlyStringProperty messageProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyStringProperty, представляющий сообщение.Определено в:
messagePropertyв интерфейсеWorker<V>Возвращает:
свойство, представляющее текущее сообщение
См. также:
-
getTitle
public final String getTitle()
Получает значение свойства title.
-
titleProperty
public final ReadOnlyStringProperty titleProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyStringProperty, представляющий заголовок.Определено в:
titlePropertyв интерфейсеWorker<V>Возвращает:
свойство, представляющее текущий заголовок
См. также:
-
cancel
public final boolean cancel()
Описание скопировано из интерфейса:WorkerПрерывает выполнение этого Worker. Вызов этого метода приведет либо к удалению этого Worker из очереди выполнения, либо к остановке выполнения.
-
cancel
public boolean cancel(boolean mayInterruptIfRunning)
-
updateProgress
protected void updateProgress(long workDone, long max)Обновляет свойстваworkDone,totalWorkиprogress. Вызовы updateProgress объединяются и выполняются позже в потоке FX-приложения, и вызовы updateProgress, даже из потока FX-приложения, могут не привести к немедленным обновлениям этих свойств, а промежуточные значения workDone могут объединяться для экономии уведомлений об событиях.maxстановится новым значением дляtotalWork.Этот метод безопасно вызывать из любого потока.
Параметры:
workDone- Значение от Long.MIN_VALUE до максимума. Если значение больше максимума, оно ограничиться максимумом. Если переданное значение отрицательно, полученный процент выполнения будет -1 (т.е. неопределенный).См. также:
-
updateProgress
protected void updateProgress(double workDone, double max)Обновляет свойстваworkDone,totalWorkиprogress. Вызовы updateProgress объединяются и выполняются позже в потоке FX-приложения, и вызовы updateProgress, даже из потока FX-приложения, могут не привести к немедленным обновлениям этих свойств, а промежуточные значения workDone могут объединяться для экономии уведомлений об событиях.maxстановится новым значением дляtotalWork.Этот метод безопасно вызывать из любого потока.
Параметры:
workDone- Значение от Double.MIN_VALUE до максимума. Если значение больше максимума, оно ограничиться максимумом. Если переданное значение отрицательно, равно бесконечности или NaN, то результат percentDone будет -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)Регистрирует обработчик событий для этой задачи. Сначала обрабатываются все фильтры событий, затем указанные обработчики событий onFoo, и, наконец, любые обработчики событий, зарегистрированные этим методом. Как и в случае с другими событиями в графической сцене, если событие потребляется, оно не будет продолжать рассылку.Типы параметров:
T- конкретный класс событий для обработчикаПараметры:
eventType- тип событий, которые должен получать обработчикИсключения:
NullPointerException- если тип события или обработчик равен nullС:
JavaFX 2.1
-
-
removeEventHandler
public final <T extends Event> void removeEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)Отменяет регистрацию ранее зарегистрированного обработчика событий для этой задачи. Один обработчик может быть зарегистрирован для разных типов событий, поэтому вызывающий код должен указать конкретный тип события, из которого нужно удалить обработчик.Параметры типа:
T- конкретный класс события обработчикаПараметры:
eventType- тип события, из которого нужно удалить обработчикИсключения:
NullPointerException- если тип события или обработчик равны nullС тех пор:
JavaFX 2.1
-
addEventFilter
public final <T extends Event> void addEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)Регистрирует фильтр событий для этой задачи. Зарегистрированные фильтры событий получают событие до любых связанных обработчиков событий.Параметры типа:
T- конкретный класс события фильтраПараметры:
eventType- тип событий, которые должен получить фильтрИсключения:
NullPointerException- если тип события или фильтр равны nullС тех пор:
JavaFX 2.1
-
removeEventFilter
public final <T extends Event> void removeEventFilter(EventType<T> eventType, EventHandler<? super T> eventFilter)Отменяет регистрацию ранее зарегистрированного фильтра событий для этой задачи. Один фильтр может быть зарегистрирован для разных типов событий, поэтому вызывающий код должен указать конкретный тип события, из которого нужно удалить фильтр.Параметры типа:
T- конкретный класс события фильтраПараметры:
eventType- тип события, из которого нужно удалить фильтрИсключения:
NullPointerException- если тип события или фильтр равны nullС тех пор:
JavaFX 2.1
-
setEventHandler
protected final <T extends Event> void setEventHandler(EventType<T> eventType, EventHandler<? super T> eventHandler)Устанавливает обработчик для этого типа событий. Одновременно может быть указан только один такой обработчик. Этот обработчик гарантированно вызывается первым. Используется для регистрации пользовательских обработчиков событий onFoo.Параметры типа:
T- конкретный класс события обработчикаПараметры:
eventType- тип события, который нужно ассоциировать с заданным обработчиком событийИсключения:
NullPointerException- если тип события равен nullС тех пор:
JavaFX 2.1
-
fireEvent
public final void fireEvent(Event event)
Вызывает указанное событие. Любой встретившийся фильтр событий будет уведомлен и сможет потреблять событие. Если оно не потребляется фильтрами, то обработчики событий в этой задаче уведомляются. Если и они не потребляют событие, то вызываются все обработчики событий и могут потреблять событие.Этот метод должен вызываться в потоке FX-пользователя.
Параметры:
event- событие, которое нужно вызватьС тех пор:
JavaFX 2.1
-
buildEventDispatchChain
public EventDispatchChain buildEventDispatchChain(EventDispatchChain tail)
Описание скопировано из интерфейса:EventTargetСоздаёт цепочку обработки событий для этого целевого объекта. Цепочка обработки событий содержит диспетчеры событий, которые могут быть заинтересованы в обработке событий, нацеленных на этотEventTarget. Этот целевой объект не добавляется в цепочку автоматически, поэтому, если он хочет обрабатывать события, он должен добавить себя в цепочку.В случае, если целевой объект является частью иерархии, цепочка для него обычно строится из диспетчеров событий, собранных от корня иерархии до целевого объекта.
Цепочка обработки событий строится путём модификаций предоставленной начальной цепочки обработки событий. Возвращаемая цепочка должна содержать начальную цепочку в конце, поэтому диспетчеры должны быть добавлены в начало начальной цепочки.
Вызывающий код не должен предполагать, что начальная цепочка останется неизменной, ни то, что возвращаемое значение будет ссылаться на другую цепочку.
Установлено:
buildEventDispatchChainв интерфейсеEventTargetПараметры:
tail- начальная цепочка для построенияВозвращает:
результирующую цепочку обработки событий для этого целевого объекта
-
© 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.