在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);是否有任何“最佳实践”来使用其中一个而另一个呢?
发布于 2016-12-20 16:37:55
与大多数UI工具包一样,在JavaFX中,除了专用UI线程(,在JavaFX的情况下)之外,不能使用访问UI组件作为显示的一部分。此外,不应在UI线程上执行需要(或可能需要)时间运行的代码(例如,具有阻塞调用,比如I/O或网络),因为它会使UI没有响应。
您发布的两个代码片段在线程处理方面有很大的不同。ScheduledExecutor将在后台线程(即不是)上执行updateTemperature()。如果运行updateTemperature()需要很长时间,这是适当的;但是如果它访问UI,它可能会抛出异常(或者更糟糕的是,它有可能使UI处于不一致的状态)。
相反,Timeline不创建新线程,并在上执行updateTemperature()。如果updateTemperature()访问UI,则必须在这个线程上执行它,这是一种方便的方法。如果运行它需要很长的时间(因为您每秒调用它4次)(我认为它不需要运行),它将产生使UI没有响应的效果。
https://stackoverflow.com/questions/41246545
复制相似问题