It's a easy approach to solve it with javafx.application.Platform class. The method Platform.runLater(java.lang.Runnable runnable) run the specified Runnable on the JavaFX Application Thread at some unspecified time in the future. You can also call Platform.isFxApplicationThread() to check if the calling thread is the JavaFX Application Thread.
package javafx.ex;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
/**
*
* @web http://java-buddy.blogspot.com/
*/
public class testScheduledExecutorService extends Application {
Text textCounter;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Start ScheduledExecutorService");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
startScheduledExecutorService();
}
});
textCounter = new Text();
VBox vBox = new VBox();
vBox.getChildren().addAll(btn, textCounter);
StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}
private void startScheduledExecutorService(){
final ScheduledExecutorService scheduler
= Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
new Runnable(){
int counter = 0;
@Override
public void run() {
counter++;
if(counter<=10){
Platform.runLater(new Runnable(){
@Override
public void run() {
textCounter.setText(
"isFxApplicationThread: "
+ Platform.isFxApplicationThread() + "\n"
+ "Counting: "
+ String.valueOf(counter));
}
});
}else{
scheduler.shutdown();
Platform.runLater(new Runnable(){
@Override
public void run() {
textCounter.setText(
"isFxApplicationThread: "
+ Platform.isFxApplicationThread() + "\n"
+ "-Finished-");
}
});
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}