Úselo Platform.runLater(...)
para operaciones rápidas y simples y Task
para operaciones complejas y grandes.
Ejemplo: ¿Por qué no podemos usarlo Platform.runLater(...)
para cálculos largos? (Tomado de la referencia a continuación).
Problema: hilo en segundo plano que solo cuenta de 0 a 1 millón y actualiza la barra de progreso en la interfaz de usuario.
Código usando 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();
Este es un horrible trozo de código, un crimen contra la naturaleza (y la programación en general). Primero, perderá células cerebrales con solo mirar este doble anidamiento de Runnables. En segundo lugar, inundará la cola de eventos con pequeños Runnables, de hecho, un millón de ellos. Claramente, necesitábamos alguna API para facilitar la escritura de trabajadores en segundo plano que luego se comunican con la interfaz de usuario.
Código usando Task:
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();
no tiene ninguno de los defectos exhibidos en el código anterior
Referencia:
Worker Threading en JavaFX 2.0