我尝试定期在 JavaFX 应用程序后台线程中运行,这会修改一些 GUI 属性。
我想我知道如何使用 javafx.concurrent
中的 Task
和 Service
类,并且无法弄清楚如何在不使用 Thread#sleep()
方法的情况下运行此类周期性任务。如果我可以使用 Executors
中的一些 Executor
制作方法 (Executors.newSingleThreadScheduledExecutor()
)
我尝试每 5 秒运行一次 Runnable
,这会重新启动 javafx.concurrent.Service
,但它会在调用 service.restart
甚至 service.getState()
时立即挂起。
所以最后我使用了 Executors.newSingleThreadScheduledExecutor()
,它每 5 秒触发一次 Runnable
,并且 Runnable
使用以下方式运行另一个 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 执行任何操作),您可以使用旧的好的 java.util.Timer
:
new Timer().schedule(
new TimerTask() {
@Override
public void run() {
System.out.println("ping");
}
}, 0, 5000);
关于JavaFX周期性后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308150/