gpt4 book ai didi

JavaFX并发: Can I run an objects method in a task?

转载 作者:行者123 更新时间:2023-12-02 12:21:43 27 4
gpt4 key购买 nike

如果我有一个带有方法的类:

class Car{
private String engineRPM;

public Car(){}

public String idleEngine(){
if (engineOn()){
engineRPM = getEngineRPM();
}
return engineRPM;
}
}

如何在 Main 中的后台线程上的任务中运行该方法,然后获取其返回值并更新 GUI?

public class Main extends Application {

Car myCar;

public static void main(String[] args) {
launch(args);

}

@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/entry.fxml"));
Parent root = loader.load();
this.mainController = (SystemMessage) loader.getController();
primaryStage.setTitle("Car");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();

//perform background task of class method here
myCar = new Car();
myCar.startEngine();
String RPM = myCar.engineIdle(); //
this.mainController.postMessage(RPM);

}

最佳答案

基本思想是

  • 创建一个 Task,其 call() 方法会在后台线程中执行您需要执行的任何操作
  • 如果任务完成后您要在 FX 应用程序线程上执行某些操作,请使用 onSucceeded 处理程序,该处理程序会在 call()< 之后调用(在 FX 应用程序线程上) 方法完成
  • call() 方法完成时,它返回的任何内容都会设置为任务的 value,因此您可以调用 getValue() 查看返回的内容
  • 从任务创建一个线程,并调用start()来执行它

所以在你的例子中,这看起来就像

public class Main extends Application {


public static void main(String[] args) {
launch(args);

}

@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/entry.fxml"));
Parent root = loader.load();
SystemMessage mainController = loader.getController();
primaryStage.setTitle("Car");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();

Task<String> carTask = new Task<String>() {
@Override
protected String call() throws Exception {
Car myCar = new Car();
myCar.startEngine();
return myCar.engineIdle();
}
};
carTask.setOnSucceeded(e -> mainController.postMessage(carTask.getValue()));
new Thread(carTask).start();

}

}

请参阅documentation for Task :它有很多例子。

关于JavaFX并发: Can I run an objects method in a task?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45722644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com