個人的には、タスクのrunメソッドをオーバーライドして、コアをビジー状態に保ち、ジョブを実行します。非視覚的なタスクは、Serviceクラスを拡張することによって実行されます。JavaFXアプリケーションスレッドは、サービスのすべてのメソッドと状態を呼び出すために排他的に使用されます。
サービスは、1つ以上のバックグラウンドスレッドでいくつかの作業を実行するために必要な情報をカプセル化する非ビジュアルコンポーネントです。
Taskは、FutureTaskの完全に監視可能な実装です。Tasksは、Workerインターフェースで定義されているように、JavaFXで非同期タスクをプログラミングするのに役立つ追加の状態と監視可能なプロパティを公開します。
メッセージの送信などの非UI計算は、タスクを実行することによって別のスレッドで実行する必要があります。JavaFXアプリケーションスレッド(EDTと同じ)からメッセージを受信したときにUIを変更(メッセージを表示)Platform.runLater(java.lang.Runnable runnable)
できますが、UIが遅くなる可能性があるため、別のスレッドから集中的な処理を行うことをお勧めします。
したがって、タスクを定義し、を呼び出すことで新しいスレッドをトリガーできますnew Thread(task).start();
。Task匿名クラスでは、メッセージの受信時にUIを更新するリスナーを追加できます。タスクには次のWorkerStateEventを含めることができ、それらをリッスンできます。
http://fxexperience.com/2011/07/worker-threading-in-javafx-2-0/のTaskを使用し、statePropertyリスナーを使用するサンプルコード。
Task task = new Task<Void>() {
@Override public Void run() {
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();
task.stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends State> observable,
State oldValue, Worker.State newState) {
if(newState==Worker.State.SUCCEEDED){
//doSomething()
}
}
});