我尝试定期在JavaFX应用程序后台线程中运行,这会修改一些GUI属性。
我想我知道如何使用Task和Service类,javafx.concurrent并且不知道如何在不使用Thread#sleep()方法的情况下运行此类定期任务。这将是很好,如果我可以使用一些Executor从Executors编造的方法(Executors.newSingleThreadScheduledExecutor())
javafx.concurrent
(Executors.newSingleThreadScheduledExecutor()
我尝试Runnable每5秒运行一次,这会重新启动,javafx.concurrent.Service但立即挂起,service.restart甚至service.getState()被调用。
所以最后我使用Executors.newSingleThreadScheduledExecutor(),它Runnable每5秒触发一次,Runnable并Runnable使用以下命令运行另一个:
Executors.newSingleThreadScheduledExecutor(),它Runnable
Platform.runLater(new Runnable() { //here i can modify GUI properties }
看起来很讨厌:(是否有更好的方法使用Task或Service类来执行此操作?
您可以使用时间表来解决此问题:
Timeline fiveSecondsWonder = new Timeline( new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("this is called every 5 seconds on UI thread"); } })); fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE); fiveSecondsWonder.play();
对于后台进程(对UI不起任何作用),您可以使用old good java.util.Timer:
new Timer().schedule( new TimerTask() { @Override public void run() { System.out.println("ping"); } }, 0, 5000);