Verwendung Platform.runLater(...)
für schnelle und einfache Operationen sowie Task
für komplexe und große Operationen.
Beispiel: Warum können wir nicht Platform.runLater(...)
für lange Berechnungen verwenden (entnommen aus der folgenden Referenz).
Problem: Hintergrund-Thread, der nur von 0 bis 1 Million zählt und den Fortschrittsbalken in der Benutzeroberfläche aktualisiert.
Code mit 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();
Dies ist ein schrecklicher Teil des Codes, ein Verbrechen gegen die Natur (und die Programmierung im Allgemeinen). Erstens verlieren Sie Gehirnzellen, wenn Sie nur diese doppelte Verschachtelung von Runnables betrachten. Zweitens wird es die Ereigniswarteschlange mit kleinen Runnables überschwemmen - eine Million davon sogar. Natürlich brauchten wir eine API, um das Schreiben von Hintergrundarbeitern zu vereinfachen, die dann wieder mit der Benutzeroberfläche kommunizieren.
Code mit Aufgabe:
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();
es leidet an keinem der Fehler, die im vorherigen Code gezeigt wurden
Referenz:
Worker Threading in JavaFX 2.0