- 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. Реализация задачи должна переопределять методcall(). Этот метод вызывается в фоновом потоке. Любое состояние, используемое в этом методе, должно быть безопасно для чтения и записи из фонового потока. Например, манипулирование живой схемой сцены из этого метода небезопасно и приведет к исключениям во время выполнения.Задачи гибкие и очень полезны для инкапсуляции «работы». Так как
Serviceпредназначен для выполнения задачи, любые задачи, определенные кодом приложения или библиотеки, могут быть легко использованы с помощью службы. Аналогично, так как Task расширяется от FutureTask, очень легко и естественно использовать Task с API конкуретности JavaExecutor. Поскольку 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, она гарантирует, что каждое изменение ее публичных свойств, а также уведомления о состоянии, ошибках и обработчиках событий происходят в основном потоке приложения 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; } };Как и прежде, в цикле мы проверяем, была ли задача отменена. Если она была отменена, мы обновим сообщение задачи, чтобы указать, что она была отменена, и затем выйдем из цикла. Если задача не была отменена, мы обновим ее сообщение, чтобы указать текущую итерацию, и обновим прогресс, чтобы указать текущий прогресс.
Простой цикл с уведомлением о прогрессе и блокирующими вызовами
Этот пример добавляет к предыдущим примерам блокирующий вызов. Поскольку блокирующий вызов может вызывать 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 связан с узлами схемы сцены (например, элементами пользовательского интерфейса), то может быть нарушено правило потоков! Для таких случаев изменяйте объект 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; } };Реагирование на изменения состояния в общем виде
Иногда может потребоваться написать задачу, которая обновляет свой прогресс, сообщение, текст или каким-либо другим образом реагирует всякий раз, когда происходит изменение состояния в задаче. Например, вы можете изменить сообщение состояния задачи при изменении состояния задачи на Failure, Success, Running или Cancelled.
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
-
Краткое описание свойств
Свойства Тип Свойство Описание 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()Вызывается при выполнении задачи, метод call должен быть переопределён и реализован подклассами.booleancancel()Прекращает выполнение этого потока.booleancancel(boolean mayInterruptIfRunning)protected voidcancelled()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние ОТМЕНЁН.ReadOnlyObjectProperty<Throwable>exceptionProperty()Возвращает ReadOnlyObjectProperty, представляющий любую возникшую ошибку.protected voidfailed()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние ОШИБКА.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 вызывается всякий раз, когда состояние задачи Task переходит в состояние SCHEDULED.voidsetOnSucceeded(EventHandler<WorkerStateEvent> value)Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи Task переходит в состояние SUCCEEDED.ReadOnlyObjectProperty<Worker.State>stateProperty()Возвращает ReadOnlyObjectProperty, представляющий текущее состояние.protected voidsucceeded()Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи Task переходит в состояние 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, toString
-
-
Подробное описание свойств
-
state
public final ReadOnlyObjectProperty<Worker.State> stateProperty
- Определено в:
-
statePropertyв интерфейсеWorker<V> - См. также:
getState()
-
onScheduled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи Task переходит в состояние SCHEDULED.- С:
- JavaFX 2.1
- См. также:
-
getOnScheduled(),setOnScheduled(EventHandler)
-
onRunning
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty
Обработчик события onRunning вызывается всякий раз, когда состояние задачи Task переходит в состояние RUNNING.- С:
- JavaFX 2.1
- См. также:
-
getOnRunning(),setOnRunning(EventHandler)
-
onSucceeded
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи Task переходит в состояние SUCCEEDED.- С:
- JavaFX 2.1
- См. также:
-
getOnSucceeded(),setOnSucceeded(EventHandler)
-
onCancelled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи Task переходит в состояние CANCELLED.- С:
- JavaFX 2.1
- См. также:
-
getOnCancelled(),setOnCancelled(EventHandler)
-
onFailed
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty
Обработчик события onFailed вызывается всякий раз, когда состояние задачи Task переходит в состояние FAILED.- С:
- JavaFX 2.1
- См. также:
-
getOnFailed(),setOnFailed(EventHandler)
-
value
public final ReadOnlyObjectProperty<V> valueProperty
- Определено в:
-
valuePropertyв интерфейсеWorker<V> - См. также:
getValue()
-
exception
public final ReadOnlyObjectProperty<Throwable> exceptionProperty
- Определено в:
-
exceptionPropertyв интерфейсеWorker<V> - См. также:
getException()
-
workDone
public final ReadOnlyDoubleProperty workDoneProperty
- Определено в:
-
workDonePropertyв интерфейсеWorker<V> - См. также:
getWorkDone()
-
totalWork
public final ReadOnlyDoubleProperty totalWorkProperty
- Определено в:
-
totalWorkPropertyв интерфейсеWorker<V> - См. также:
getTotalWork()
-
progress
public final ReadOnlyDoubleProperty progressProperty
- Определено в:
-
progressPropertyв интерфейсеWorker<V> - См. также:
getProgress()
-
running
public final ReadOnlyBooleanProperty runningProperty
- Определено в:
-
runningPropertyв интерфейсеWorker<V> - См. также:
isRunning()
-
message
public final ReadOnlyStringProperty messageProperty
- Определено в:
-
messagePropertyв интерфейсеWorker<V> - См. также:
getMessage()
-
title
public final ReadOnlyStringProperty titleProperty
- Определено в:
-
titlePropertyв интерфейсеWorker<V> - См. также:
getTitle()
-
-
Подробное описание конструкторов
-
Task
public Task()
Создаёт новую задачу.
-
-
Подробное описание методов
-
вызов
protected abstract V call() throws Exception
Вызывается при выполнении задачи; метод вызова должен быть переопределён и реализован подклассами. Метод вызова фактически выполняет логику потока фоновых задач. Из кода этого метода можно вызывать только методы updateProgress, updateMessage, updateValue и updateTitle задачи. Любые другие взаимодействия с задачей из потока фоновых задач приведут к исключениям во время выполнения.- Возвращает:
- Результат фоновой работы, если таковой имеется.
- Выбрасывает:
-
Exception- необработанное исключение, произошедшее во время фоновой операции
-
получитьСостояние
public final Worker.State getState()
Получает значение свойства состояние.
-
свойствоСостояние
public final ReadOnlyObjectProperty<Worker.State> stateProperty()
Описание скопировано из интерфейса:WorkerПолучает ReadOnlyObjectProperty, представляющий текущее состояние.- Указано в:
-
statePropertyв интерфейсеWorker<V> - См. также:
getState()
-
свойствоonScheduled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onScheduledProperty()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.- С момента:
- JavaFX 2.1
- См. также:
-
getOnScheduled(),setOnScheduled(EventHandler)
-
получитьonScheduled
public final EventHandler<WorkerStateEvent> getOnScheduled()
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.- Возвращает:
- обработчик события onScheduled, если таковой имеется
- С момента:
- JavaFX 2.1
-
установитьonScheduled
public final void setOnScheduled(EventHandler<WorkerStateEvent> value)
Обработчик события onSchedule вызывается всякий раз, когда состояние задачи переходит в состояние SCHEDULED.- Параметры:
-
value- обработчик события, может быть null для очистки - С момента:
- JavaFX 2.1
-
запланировано
protected void scheduled()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SCHEDULED. Этот метод вызывается в потоке FX приложения после того, как задача полностью перешла в новое состояние.- С момента:
- JavaFX 2.1
-
свойствоonRunning
public final ObjectProperty<EventHandler<WorkerStateEvent>> onRunningProperty()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.- С момента:
- JavaFX 2.1
- См. также:
-
getOnRunning(),setOnRunning(EventHandler)
-
получитьonRunning
public final EventHandler<WorkerStateEvent> getOnRunning()
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.- Возвращает:
- обработчик события onRunning, если таковой имеется
- С момента:
- JavaFX 2.1
-
установитьonRunning
public final void setOnRunning(EventHandler<WorkerStateEvent> value)
Обработчик события onRunning вызывается всякий раз, когда состояние задачи переходит в состояние RUNNING.- Параметры:
-
value- обработчик события, может быть null для очистки - С момента:
- JavaFX 2.1
-
работает
protected void running()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние RUNNING. Этот метод вызывается в потоке FX приложения после того, как задача полностью перешла в новое состояние.- С момента:
- JavaFX 2.1
-
свойствоonSucceeded
public final ObjectProperty<EventHandler<WorkerStateEvent>> onSucceededProperty()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.- С момента:
- JavaFX 2.1
- См. также:
-
getOnSucceeded(),setOnSucceeded(EventHandler)
-
получитьonSucceeded
public final EventHandler<WorkerStateEvent> getOnSucceeded()
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.- Возвращает:
- обработчик события onSucceeded, если таковой имеется
- С момента:
- JavaFX 2.1
-
установитьonSucceeded
public final void setOnSucceeded(EventHandler<WorkerStateEvent> value)
Обработчик события onSucceeded вызывается всякий раз, когда состояние задачи переходит в состояние SUCCEEDED.- Параметры:
-
value- обработчик события, может быть null для очистки - С момента:
- JavaFX 2.1
-
успешно
protected void succeeded()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние SUCCEEDED. Этот метод вызывается в потоке FX приложения после того, как задача полностью перешла в новое состояние.- С момента:
- JavaFX 2.1
-
свойствоonCancelled
public final ObjectProperty<EventHandler<WorkerStateEvent>> onCancelledProperty()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.- С момента:
- JavaFX 2.1
- См. также:
-
getOnCancelled(),setOnCancelled(EventHandler)
-
получитьonCancelled
public final EventHandler<WorkerStateEvent> getOnCancelled()
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.- Возвращает:
- обработчик события onCancelled, если таковой имеется
- С момента:
- JavaFX 2.1
-
установитьonCancelled
public final void setOnCancelled(EventHandler<WorkerStateEvent> value)
Обработчик события onCancelled вызывается всякий раз, когда состояние задачи переходит в состояние CANCELLED.- Параметры:
-
value- обработчик события, может быть null для очистки - С момента:
- JavaFX 2.1
-
отменено
protected void cancelled()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние CANCELLED. Этот метод вызывается в потоке FX приложения после того, как задача полностью перешла в новое состояние.- С момента:
- JavaFX 2.1
-
свойствоonFailed
public final ObjectProperty<EventHandler<WorkerStateEvent>> onFailedProperty()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.- С момента:
- JavaFX 2.1
- См. также:
-
getOnFailed(),setOnFailed(EventHandler)
-
получитьonFailed
public final EventHandler<WorkerStateEvent> getOnFailed()
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.- Возвращает:
- обработчик события onFailed, если таковой имеется
- С момента:
- JavaFX 2.1
-
установитьonFailed
public final void setOnFailed(EventHandler<WorkerStateEvent> value)
Обработчик события onFailed вызывается всякий раз, когда состояние задачи переходит в состояние FAILED.- Параметры:
-
value- обработчик события, может быть null для очистки - С момента:
- JavaFX 2.1
-
неудача
protected void failed()
Защищённый вспомогательный метод для подклассов, вызываемый всякий раз, когда состояние задачи переходит в состояние FAILED. Этот метод вызывается в потоке FX приложения после того, как задача полностью перешла в новое состояние.- С момента:
- JavaFX 2.1
-
-
valueProperty
public final ReadOnlyObjectProperty<V> valueProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyObjectProperty, представляющий значение.- Определено в:
-
valuePropertyв интерфейсеWorker<V> - См. также:
getValue()
-
getException
public final Throwable getException()
Возвращает значение свойства exception.- Определено в:
-
getExceptionв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- исключение, если оно произошло
-
exceptionProperty
public final ReadOnlyObjectProperty<Throwable> exceptionProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyObjectProperty, представляющий любое возникшее исключение.- Определено в:
-
exceptionPropertyв интерфейсеWorker<V> - См. также:
getException()
-
getWorkDone
public final double getWorkDone()
Возвращает значение свойства workDone.- Определено в:
-
getWorkDoneв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- объем выполненной работы
- См. также:
-
Worker.totalWorkProperty(),Worker.progressProperty()
-
workDoneProperty
public final ReadOnlyDoubleProperty workDoneProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyDoubleProperty, представляющий текущую степень выполнения.- Определено в:
-
workDonePropertyв интерфейсеWorker<V> - См. также:
getWorkDone()
-
getTotalWork
public final double getTotalWork()
Возвращает значение свойства totalWork.- Определено в:
-
getTotalWorkв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- общий объем работы
- См. также:
-
Worker.workDoneProperty(),Worker.progressProperty()
-
totalWorkProperty
public final ReadOnlyDoubleProperty totalWorkProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyDoubleProperty, представляющий максимальный объем работы, который нужно выполнить. Эти "рабочие единицы" имеют смысл для реализации Worker, например, количество байтов, которые нужно загрузить, количество изображений для обработки или какой-либо другой показатель.- Определено в:
-
totalWorkPropertyв интерфейсеWorker<V> - См. также:
getTotalWork()
-
getProgress
public final double getProgress()
Возвращает значение свойства progress.- Определено в:
-
getProgressв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- текущую степень выполнения
- См. также:
-
Worker.workDoneProperty(),Worker.totalWorkProperty()
-
progressProperty
public final ReadOnlyDoubleProperty progressProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyDoubleProperty, представляющий степень выполнения.- Определено в:
-
progressPropertyв интерфейсеWorker<V> - См. также:
getProgress()
-
isRunning
public final boolean isRunning()
Возвращает значение свойства running.
-
runningProperty
public final ReadOnlyBooleanProperty runningProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyBooleanProperty, представляющий, выполняется ли Worker.- Определено в:
-
runningPropertyв интерфейсеWorker<V> - См. также:
isRunning()
-
getMessage
public final String getMessage()
Возвращает значение свойства message.- Определено в:
-
getMessageв интерфейсеWorker<V> - Описание свойства:
- Возвращает:
- текущее сообщение
-
messageProperty
public final ReadOnlyStringProperty messageProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyStringProperty, представляющий сообщение.- Определено в:
-
messagePropertyв интерфейсеWorker<V> - См. также:
getMessage()
-
getTitle
public final String getTitle()
Возвращает значение свойства title.
-
titleProperty
public final ReadOnlyStringProperty titleProperty()
Описание, скопированное из интерфейса:WorkerВозвращает ReadOnlyStringProperty, представляющий заголовок.- Определено в:
-
titlePropertyв интерфейсеWorker<V> - См. также:
getTitle()
-
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 до max. Если значение больше max, то оно будет ограничено max. Если переданное значение отрицательное, то полученный процент выполнения будет -1 (т.е. неопределённый). -
max- Значение от Long.MIN_VALUE до Long.MAX_VALUE. - См. также:
updateProgress(double, double)
-
-
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. Если переданное значение отрицательное, или Infinity, или NaN, то результирующее percentDone будет -1 (следовательно, неопределённое). -
max- значение от Double.MIN_VALUE до Double.MAX_VALUE. Infinity и 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)
Регистрирует обработчик событий для этой задачи. Сначала обрабатываются все фильтры событий, затем указанные обработчики событий 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
-
buildEventDispatchChain
public EventDispatchChain buildEventDispatchChain(EventDispatchChain tail)
Описание скопировано из интерфейса:EventTargetСоздаёт цепочку распределения событий для этого целевого объекта. Цепочка распределения событий содержит диспетчеры событий, которые могут быть заинтересованы в обработке событий, направленных на этотEventTarget. Этот целевой объект не добавляется автоматически в цепочку, поэтому, если он хочет обрабатывать события, ему нужно добавитьEventDispatcherдля себя в цепочку.В случае, если целевой объект является частью иерархии, цепочка для него обычно строится из диспетчеров событий, собранных от корня иерархии до целевого объекта.
Цепочка распределения событий строится путём модификации предоставленной исходной цепочки распределения событий. Возвращаемая цепочка должна содержать исходную цепочку в конце, поэтому диспетчеры должны быть добавлены в начало исходной цепочки.
Вызывающий код не должен предполагать, что исходная цепочка остаётся неизменной, или что возвращаемое значение будет ссылаться на другую цепочку.
- Определено:
-
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.