【问题标题】:List of Methods required to be run in JavaFX Application Thread?需要在 JavaFX 应用程序线程中运行的方法列表?
【发布时间】:2017-10-26 13:51:16
【问题描述】:

我目前正在尝试开发 JavaFX 应用程序(游戏)。为了保持应用程序顺利运行,我尝试将尽可能多的程序逻辑放到一个单独的线程中。但是,我经常偶然发现一些 JAVAFX API 调用需要在 JFX 应用程序线程中运行的问题。例如。创建一组矩形并为其着色,可以在一个线程中完成 - 在将它们添加到“组”时,调用 .doLayout() 和 .applycss() 需要 JFX Appl。线。 我还意识到,“.play()”转换也需要在 JFX 应用程序线程中运行。

问题是 - 如果您没有在正确的线程中执行它 - 在 JFX 中可能会随机发生“数组越界”异常,这不会指出根本原因。总是很难确定程序和图形逻辑是否可以卸载到线程或需要在 JFX 应用程序线程中运行。

有人知道需要在 JFX 应用程序线程下运行的 JavaFX 方法调用列表吗?

谢谢大家!

【问题讨论】:

    标签: java multithreading javafx


    【解决方案1】:

    根据Application class documentation(这也在JavaFX文档的其他地方指定):

    必须在 JavaFX 应用程序线程上创建 JavaFX 场景和舞台对象以及将场景图操作修改为活动对象(那些已附加到场景的对象)。

    因此,您可以在后台线程上创建新节点(例如矩形),并且只要它们尚未附加到场景,您就可以在后台线程上修改它们的属性(例如“为它们着色”)。将节点附加到场景后,必须在 FX 应用程序线程上对节点进行任何修改。

    如果窗格或组附加到场景,则调用 getChildren().add(...) 会修改该窗格/组,因此必须在 FX 应用程序线程上执行。您引用的其他示例(layout()applyCSS())仅在相关节点附加到场景时才有意义。

    【讨论】:

    • 谢谢你。这是否也意味着例如Node.getBoundsInParent().getHeight() 需要在 JFX appl 线程中运行吗?
    • @Defarine 这个问题(“如果你不修改它们,你能从后台线程访问'实时'节点属性吗?”)实际上我见过的任何文档都没有明确回答。但是,我认为可以公平地假设,如果没有同步可以使修改属性成为线程安全,那么也没有同步可以安全地访问它,所以我将规则解释为“你应该只访问”来自 FX 应用程序线程的实时“节点”。
    • @Defarine TBH 我很难看到任何真正的用例,你想从后台线程访问节点的高度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多