Класс Thread
является частью стандартного Java API и представляет фоновый поток. Когда запускается Thread
, код либо его Runnable
метода *1003*, либо его собственного run
метода выполняется по существу параллельно с другими запущенными потоками. Это позволяет коду, выполнение которого может занять много времени, без задержки другого кода, который может быть запущен «одновременно». Программисту стоит использовать это так, что следует соблюдать особую осторожность, если данные распределяются между различными потоками, чтобы гарантировать, что они считываются в согласованном состоянии в любом отдельном потоке, и что данные являются «живыми»: то есть эти изменения данные, сделанные в одном потоке, фактически наблюдаются в других потоках.
В отличие от этого, Timeline
является частью инфраструктуры JavaFX и, в частности, частью его API анимации. При запуске приложения JavaFX запускается поток, называемый потоком приложения FX. Этот поток выполняется в al oop и отвечает за отображение пользовательского интерфейса и обработку пользовательских событий (среди прочего). Визуализация пользовательского интерфейса происходит по «импульсу», который (в текущей версии) предназначен для выполнения 60 раз в секунду. Из-за проблем синхронизации данных, упомянутых выше, все изменения в пользовательском интерфейсе должны быть внесены в поток приложения FX. Кроме того, код в потоке приложения FX не должен быть длительным (поэтому он не может делать паузу с sleep()
или читать большие наборы данных через IO), потому что он заблокирует поток от рендеринга пользовательского интерфейса.
A Timeline
работает с набором KeyFrame
s, каждый из которых указывает время (в форме Duration
, измеренное с начала временной шкалы) и обработчик события и / или KeyValue
. На каждом импульсе потока приложения FX, если работает Timeline
, поток приложения FX l oop будет проверять, пора ли запускать какие-либо обработчики событий. Для KeyValue
с, если значение является интерполируемым (например, является цифрой c или реализует Interpolatable
, его значение будет рассчитываться путем вычисления времени, прошедшего как доля времени для следующего KeyFrame
.
Timeline
s полезны для простых анимаций (например, перемещая узел по панели, используя KeyValue
s, которые определяют его расположение или координаты перевода, или аналогичные), а также для выполнения дискретного набор обновлений пользовательского интерфейса в определенные моменты времени c (например, отображение и скрытие изображений в «памяти»).
Следовательно:
- Код в обработчиках событий для
KeyFrame
прикрепленный к Timeline
может обновить пользовательский интерфейс, поскольку он гарантированно будет выполняться в потоке приложений FX KeyValue
s, которые обновляются как часть KeyFrame
в Timeline
. свойства элементов пользовательского интерфейса, отображаемых на экране - Код в обработчиках событий для
KeyFrame
s не должен блокировать выполнение или выполнять длительные задачи - Попытка использовать
Timeline
в не-JavaFX-приложение (т.е. где среда выполнения JavaFX не была запущена) завершится сбоем, поскольку не будет потока приложений JavaFX для выполнения обновлений.
И наоборот:
- Код, выполняемый на background
Thread
не должен обновлять элементы пользовательского интерфейса (или их свойства). Это верно как для JavaFX, так и для Java Swing / AWT - Код, выполняемый в фоновом потоке, может блокировать или выполнять долгосрочные задачи
Обратите внимание, что java.util.Timer
и это связанный TimerTask
(который является частью стандартного Java API) выполнения в фоновом потоке, созданном внутри Timer
. Это означает, что хотя API Timer
и TimerTask
выглядят несколько похожими на Timeline
, они должны подчиняться правилам фоновых потоков (не должны обновлять пользовательский интерфейс и т. Д. c).