Граф сцены JavaFX, представляющий графический пользовательский интерфейс приложения JavaFX, не является потокобезопасным и может быть доступен и изменен только из потока пользовательского интерфейса JavaFX Application Thread.
Реализация долго выполняющихся задач в потоке приложения JavaFX неизбежно делает пользовательский интерфейс приложения невосприимчивым.
Поэтому лучшей практикой является выполнение этих задач на одном или нескольких фоновых потоках и использование потока приложения JavaFX для обработки пользовательских событий.
Работу с фоновыми потоками пакет concurrent обеспечивает с помощью двух абстрактных классов Task и Service, реализующих интерфейс Worker.
Интерфейс Worker определяет объект, который выполняет некоторую работу в одном или нескольких фоновых потоках.
Состояние объекта Worker является наблюдаемым и может использоваться из потока приложения JavaFX.
Жизненный цикл объекта Worker определяется следующим образом.
При создании объект Worker находится в состоянии READY.
При планировании работы объект Worker переходит в состояние SCHEDULED.
После этого, когда объект Worker выполняет работу, его состояние становится RUNNING.
Даже когда объект Worker немедленно запускается без планирования, он сначала переходит в состояние SCHEDULED, а затем в состояние RUNNING.
Состояние объекта Worker, которое завершается успешно, является SUCCEEDED, а свойство value установлено как результат этого объекта Worker.
В противном случае, если во время выполнения объекта Worker выбрасываются какие-либо исключения, его состояние становится FAILED, а для свойства исключения устанавливается тип произошедшего исключения.
В любое время, до завершения объекта Worker разработчик может прервать его, вызвав метод cancel, который помещает объект Worker в состояние CANCELED.
Прогресс работы, выполняемый объектом Worker, может быть получен с помощью трех различных свойств, таких как totalWork, workDone и progress.
Абстрактный класс Task расширяет класс java.util.concurrent. FutureTask, и конкретные реализации абстрактного класса Task должны переопределять его метод call, вызываемый средой выполнения в фоновом потоке.