Используйте Platform.runLater(...)
для быстрых и простых операций, а также Task
для сложных и больших операций.
Пример: Почему нельзя использовать Platform.runLater(...)
для долгих расчетов (взято из ссылки ниже).
Проблема: фоновый поток, который просто считает от 0 до 1 миллиона и обновляет индикатор выполнения в пользовательском интерфейсе.
Код с использованием Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
@Override public void run() {
for (int i = 1; i <= 1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
bar.setProgress(counter / 1000000.0);
}
});
}
}).start();
Это отвратительный кусок кода, преступление против природы (и программирования в целом). Во-первых, вы потеряете клетки мозга, просто глядя на это двойное вложение Runnables. Во-вторых, очередь событий заполнится маленькими Runnables - на самом деле миллионом. Ясно, что нам нужен был некоторый API, чтобы упростить написание фоновых рабочих, которые затем взаимодействуют с пользовательским интерфейсом.
Код с использованием задачи:
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i = 1; i <= max; i++) {
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
он не страдает ни одним из недостатков, представленных в предыдущем коде
Ссылка:
Worker Threading в JavaFX 2.0