我试图通过阅读文章javafx concurrency来弄清楚并发在 javafx 中的工作原理,但是,我想知道如何在对象call
方法中更新全局静态变量的值FutureTask
?这是一个简单的例子来理解我在说什么;
public class Sample extends Application {
static int x = 5;
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
FutureTask<String> futTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("in thread");
x = 6;
return "foobar";
}
});
Platform.runLater(futTask);
if( futTask.isDone() )
System.out.println("Done" + " x = " + x);
}
因此,futTask.isDone()
永远不会返回 true。我可以理解,futTask 可能还没有完成它的过程,或者它可能由于Platform.runLater
. 但是,“in thread”字符串打印在控制台上,那么为什么 x 没有更新到 6 呢?