【发布时间】:2013-12-29 20:49:17
【问题描述】:
我刚刚写了一个简单的 JavaFX 程序。它显示一个圆圈。
然后我启动 2 个不同的线程。
在循环中修改 X 位置。另一个修改 Y 位置。圆圈移动。它似乎有效。
所以,我的问题是:我应该感到惊讶吗?担心?可以吗?
我知道这一点:
http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
但是……不知何故我不需要它?
任何意见表示赞赏。
【问题讨论】:
我刚刚写了一个简单的 JavaFX 程序。它显示一个圆圈。
然后我启动 2 个不同的线程。
在循环中修改 X 位置。另一个修改 Y 位置。圆圈移动。它似乎有效。
所以,我的问题是:我应该感到惊讶吗?担心?可以吗?
我知道这一点:
http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
但是……不知何故我不需要它?
任何意见表示赞赏。
【问题讨论】:
这里要理解的重要一点是,从 FX 应用程序线程以外的线程修改 UI 状态不能保证正常工作。这并不意味着它永远不会起作用,但它确实意味着你不应该这样做。它可能在给定的平台上和 Java 和 JavaFX 运行时的特定实现上工作,但可能在其他平台上失败,或者当你升级你的 JVM 时,或者甚至只是有时当你运行并发生时在执行方法调用时获得错误的时机。
所以,我的问题是:我应该感到惊讶吗?
没有。
担心吗?
您应该担心不建议您这样做。您不必担心它似乎可以在一个或多个特定平台上运行。
可以吗?
没有。
修复很简单...保持线程不变,在这些线程中进行所有计算,以及任何Thread.sleep(...) 或您可能遇到的其他暂停,但将对setCenterX(...) 和setCenterY(...) 的调用包装起来在Platform.runLater(...)。
【讨论】:
runLater 是关键)。