就个人而言,我只是重写了Task的 run 方法来保持核心忙碌并完成工作。非可视任务是通过扩展 Service 类来完成的。JavaFX 应用程序线程专门用于调用Service上的所有方法和状态。
服务是一种非可视组件,它封装了在一个或多个后台线程上执行某些工作所需的信息。
Task 是 FutureTask 的完全可观察的实现。Tasks 公开了额外的状态和可观察属性,这些属性对于在 JavaFX 中编写异步任务很有用,这些属性在 Worker 接口中定义。
发送消息等非 UI 计算应该通过运行任务在单独的线程中进行。当使用Platform.runLater(java.lang.Runnable runnable)
从 JavaFX 应用程序线程(与 EDT 相同)接收消息时,您可以更改 UI(显示消息),但它会使 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()
}
}
});