JavaFX任务状态未正确更新?
各位程序员好 因此,我终于开始使用JavaFX,并发现了一些似乎不正确的东西。 如果覆盖任务的调用方法,然后运行该方法,则此任务的状态将在调用完成后开始更新 我的代码看起来像这样JavaFX任务状态未正确更新?,java,javafx,task,javafx-8,controlsfx,Java,Javafx,Task,Javafx 8,Controlsfx,各位程序员好 因此,我终于开始使用JavaFX,并发现了一些似乎不正确的东西。 如果覆盖任务的调用方法,然后运行该方法,则此任务的状态将在调用完成后开始更新 我的代码看起来像这样 Task<Boolean> myTask = new Task<Boolean>() { @Override protected Boolean call() throws Exception { try { // do stuff
Task<Boolean> myTask = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
try {
// do stuff
return true;
} catch (Exception e){
return false;
}
}
}
现在,我所期望的顺序是将状态设置为首先调度,然后在执行调用方法之前运行。在我的情况下,它总是先调用,然后一段时间后,它会改变状态
例如:
package test;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.concurrent.Worker;
import javafx.stage.Stage;
public class TaskTest extends Application {
@Override
public void start(Stage primaryStage) {
Task<Void> myTask = new Task<Void>() {
@Override
protected Void call() throws Exception {
System.out.println("Executing stuff");
return null;
}
};
myTask.stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(
ObservableValue<? extends javafx.concurrent.Worker.State> observable,
Worker.State oldValue,
Worker.State newValue) {
System.out.println("State change: " + oldValue + " -> " + newValue);
}
});
Executors.newSingleThreadExecutor().execute(myTask);
try {
myTask.get();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
预期:
State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
Executing stuff
State change: RUNNING -> SUCCEEDED
runLater只是将其放在JavaFX应用程序线程上。调用不需要在runLater中调用,事实上,您特别不希望它这样做,因为这会阻止应用程序线程按预期工作,您可能需要发布更多代码。@MattJennings hello,我添加了更多的代码和我期望的解释,显示了运行任务的代码。@James\u D我用Thread t=new ThreadmyTask;然后是t.run、myTask.run和Executors.newSingleThreadExecutor.executemyTask;。所有三个变量都会导致上述事件顺序。您希望t.start;,不是t.run;。虽然遗嘱执行人。。。代码应该有效。
Executing stuff
State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
State change: RUNNING -> SUCCEEDED
State change: READY -> SCHEDULED
State change: SCHEDULED -> RUNNING
Executing stuff
State change: RUNNING -> SUCCEEDED