Platform.runLater(...)
迅速で単純な操作、およびTask
複雑で大規模な操作に使用します。
例:Platform.runLater(...)
長い計算に使用できない理由(以下の参照から取得)。
問題:0から100万までカウントし、UIのプログレスバーを更新するバックグラウンドスレッド。
使用するコード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でイベントキューを圧倒するでしょう-実際にはそれらの百万。明らかに、UIと通信するバックグラウンドワーカーを簡単に作成できるようにするための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();
それは前のコードで示された欠陥のどれにも苦しんでいません
参照:
JavaFX2.0でのワーカースレッド