2017-09-22 50 views
-1

JavaFX应用程序线程。我可以找到的来源说节点上的所有更新都必须发生在这个线程中。更新应用程序线程之外的JavaFX Live节点

我想找到这个文件,如果有任何例外这个规则。 https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm ,因为它说:

JavaFX的场景图,其表示JavaFX应用程序的图形用户界面,是不是线程安全并且只能访问和从UI线程也被称为JavaFX的改性应用线程。

https://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#A1107438

任何“活”的场景,这是一个场景是一个窗口的一部分,必须从这个线程访问。场景图可以在后台线程中创建和操作,但是当其根节点连接到场景中的任何活动对象时,必须从JavaFX应用程序线程访问该场景图。

我经历过并非所有节点上的更新都必须在JavaFX AT上完成。更新节点的一些调用在此线程外正常工作。 例如,更新文本textProperty不需要在JavaFX AT内运行。因此,它看起来像设置工具提示,或者更改可见性/禁用/管理。

更新的标签textProperty JavaFX的AT之外将抛出

IllegalStateException异常:未对外汇应用程序线程; currentThread =任务

回答

2

你在混淆抛出异常的不允许的内容。仅仅因为某些东西不会抛出异常并不意味着它被允许,或者它是安全的,或者它可以保证工作。

对于实时场景图必须为的节点的所有更改都发生在JavaFX应用程序线程上。

如果违反此规则,JavaFX将尽最大努力抛出异常。检查线程的开销时间,对于某些操作,检查线程的性能成本太高,因此并非所有违规都会导致异常。但是,即使未抛出异常,违反规则在未来的任意时间也容易出现不一致的行为。有关这种情况的实例,请参阅Moving circle randomly disappears (javafx)

+0

感谢您澄清。 Swing的文档提到它可以工作,但有不可预知的错误。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html 对于JavaFX没有这样的声明,只是它必须在FX应用程序线程上运行。 – DJViking

+0

@DJViking它声明它是单线程的。假设使用该工具包的程序员理解跨多个线程使用单线程API的后果可能是合理的。 –

相关问题