i'm trying to figure out how concurrency works in javafx by reading the article javafx concurrency,however, i wonder how can i update the value of a global static variable in call
method of FutureTask
object ? Here is a simple example to understand what i am talking about;
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);
}
So, futTask.isDone()
never returns true. I can understand that maybe futTask hasn't been finished its process, or it may hasn't been called due to Platform.runLater
. But, "in thread" string is printed on console,so why x isn't beeing updated to 6 ?.