在JavaFX 8项目中,您可以像这样使用javafx.animation.Timeline:
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(250),
actionEvent -> {
updateTemperature();
}
)
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
或者你可以使用ScheduledExecutorService
:
executorService.scheduleAtFixedRate(this::updateTemperature, 0, 250, TimeUnit.SECONDS);
使用其中一种是否有“最佳做法”?
答案 0 :(得分:1)
与大多数UI工具包一样,在JavaFX中,不得从专用UI线程以外的任何线程访问作为显示一部分的UI组件(在JavaFX的情况下为FX Application Thread) 。此外,运行时间(或可能需要)的代码(例如,具有阻塞调用,如I / O或网络)不应在UI线程上执行,因为它会使UI无响应。
您发布的两个代码段在线程方面有很大不同。 ScheduledExecutor
将在后台线程(即不是FX应用程序线程)上执行updateTemperature()
。如果updateTemperature()
需要很长时间才能运行,这是合适的。但如果它访问UI,它可能会抛出异常(或者更糟糕的是,有可能使UI处于不一致状态)。
相比之下,Timeline
不创建新线程并在FX应用程序线程上执行updateTemperature()
。如果updateTemperature()
访问UI,则必须在此线程上执行,这是一种方便的方法。如果运行需要很长时间(我认为它没有,因为你每秒钟调用它4次),它会导致UI无响应。