JavaFX时间轴与ScheduledExecutorService

时间:2016-12-20 16:05:46

标签: java javafx scheduled-tasks

在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);

使用其中一种是否有“最佳做法”?

1 个答案:

答案 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无响应。