【问题标题】:Modifying state from other threads从其他线程修改状态
【发布时间】:2013-12-29 20:49:17
【问题描述】:

我刚刚写了一个简单的 JavaFX 程序。它显示一个圆圈。

然后我启动 2 个不同的线程。

在循环中修改 X 位置。另一个修改 Y 位置。圆圈移动。它似乎有效。

所以,我的问题是:我应该感到惊讶吗?担心?可以吗?

我知道这一点:

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

但是……不知何故我不需要它?

任何意见表示赞赏。

【问题讨论】:

    标签: javafx-2 javafx-8


    【解决方案1】:

    这里要理解的重要一点是,从 FX 应用程序线程以外的线程修改 UI 状态不能保证正常工作。这并不意味着它永远不会起作用,但它确实意味着你不应该这样做。它可能在给定的平台上和 Java 和 JavaFX 运行时的特定实现上工作,但可能在其他平台上失败,或者当你升级你的 JVM 时,或者甚至只是有时当你运行并发生时在执行方法调用时获得错误的时机。

    所以,我的问题是:我应该感到惊讶吗?

    没有。

    担心吗?

    您应该担心不建议您这样做。您不必担心它似乎可以在一个或多个特定平台上运行。

    可以吗?

    没有。

    修复很简单...保持线程不变,在这些线程中进行所有计算,以及任何Thread.sleep(...) 或您可能遇到的其他暂停,但将对setCenterX(...)setCenterY(...) 的调用包装起来在Platform.runLater(...)

    【讨论】:

    • 另一件事:查看Animation API,这很可能是实现此类功能的更自然的方式。
    • 谢谢! @Eeliya 用于提问,@James_D 用于回答。作为问题的原始发布者,让我说我对这个答案非常满意(如果可以的话,我会将其标记为 the 答案)。我自己的独立发现也使我得出了这个结论(使用runLater 是关键)。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多