Ответ 1
Используйте Platform.runLater(...)
для быстрых и простых операций и Task
для сложных и больших операций.
- Использовать регистр для
Platform.runLater(...)
- Использовать регистр для
Task
: Пример задачи в приложении Ensemble
Пример: Почему мы не можем использовать 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