首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX Timeline诉ScheduledExecutorService

JavaFX Timeline诉ScheduledExecutorService
EN

Stack Overflow用户
提问于 2016-12-20 16:05:46
回答 1查看 381关注 0票数 0

在JavaFX 8项目中,您可以像这样使用javafx.animation.Timeline:

代码语言:javascript
复制
Timeline timeline = new Timeline(
            new KeyFrame(Duration.millis(250),
                         actionEvent -> {
                               updateTemperature();
                         }
            )
    );
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

或者您可以使用ScheduledExecutorService进行非常类似的操作。

代码语言:javascript
复制
executorService.scheduleAtFixedRate(this::updateTemperature, 0, 250, TimeUnit.SECONDS);

是否有任何“最佳实践”来使用其中一个而另一个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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没有响应的效果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41246545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档