2

我目前正在尝试调试同时使用 JavaFX 和 Swing 的中等规模(数十万行)Java 项目,并且我经常遇到一些奇怪的异常,我很确定这是因为 UI代码没有在正确的线程上调用。这些异常的堆栈跟踪根本没有帮助,因为它们几乎都源自 UI 绘图线程。

现在,我当然可以坐下来用牙梳调试每个 UI 调用,直到找到一个没有在正确线程上调用的调用,然后在整个项目中继续这样做,但这将是一项非常漫长的任务。是否有某种形式的更简单的方法来进行这种调试?例如,以某种方式导致 UI 代码打印出调试消息或在未从相应线程调用时抛出异常?

4

2 回答 2

3

您可以通过打开玻璃中的线程检查-Dglass.disableThreadChecks=false。这将打开 JavaFX 最低层中的线程检查,该层负责使用 OS 级别的 API。在大多数情况下,这些检查就足够了,因为大多数调用都以 Glass 结束。这些检查将很快默认启用。

于 2013-09-10T15:26:28.610 回答
3

在同一线程上运行 JavaFX 和 Swing 可能有助于解决您的线程问题。

Java 8 中有一个实验特性可以在同一线程上运行 JavaFX 和 Swing:

https://javafx-jira.kenai.com/browse/RT-30694 http://bugs.sun.com/view_bug.do?bug_id=8015477

我认为-Djavafx.embed.singleThread=true是启用实验性单线程系统的命令行属性设置。

我不确定当前 Java 8 版本中是否提供了实验性功能,但我认为现在可能有,因此您不妨尝试一下。

如果您需要有关实验性单线程功能的更多信息,您可以在openjfx-dev 邮件列表中询问开发人员。


Java 8 在代码未在正确线程上运行时具有更好的内置报告,它并不全面,但它可能会帮助您定位错误源,即使您没有使用单线程选项。


其他一些运行合并 Swing 和 JavaFX 的大型应用程序的用户报告了类似的难以调试线程问题,因此您可以检查这些线程以查看您的问题是否具有相同的原因。

于 2013-09-07T16:22:03.043 回答