【问题标题】:Locating UI code not on the platform / dispatch thread定位 UI 代码不在平台/调度线程上
【发布时间】:2013-09-07 14:51:17
【问题描述】:

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

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

【问题讨论】:

标签: java swing user-interface javafx ui-thread


【解决方案1】:

在同一线程上运行 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是启用实验性单线程系统的命令行属性设置。

我不确定experimental feature 是否在current Java 8 builds 中可用,但我想现在可能有,所以你不妨试试。

如果您需要有关实验性单线程功能的更多信息,可以通过openjfx-dev mailing list 向开发人员咨询。


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


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

【讨论】:

  • 谢谢,Java 8 打印出的东西实际上并不是直接的问题,但最终确实让我找到了它。 FWIW,我真的认为需要全面支持检查东西何时没有在正确的线程上运行,即使这只是您可以打开的调试选项 - 即使不组合多个工具包也是一个非常容易的错误这样做可能会导致以后调试地狱。嗯……至少,Java 8 是朝着正确方向迈出的一步。
  • 这实际上是一个非常实验性的功能。您可以使用jdk8.java.net 的当前 EA 构建进行尝试
  • @Petr 当然,我意识到,作为 JDK8 的一部分,我不会将其归类为更少!虽然只是为了利用这个特性,但它确实证明在临时将我的应用程序与 Java 8 一起运行时很有用。
【解决方案2】:

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

【讨论】:

  • 谢谢 - 我现在打开了一个有用的选项!幸运的是,似乎没有打印任何东西,我想这是一个好兆头。这个选项对我来说似乎是一种奇怪的方式 - 我本来期望类似于enableThreadChecks=true
  • 这是历史性的。线程检查无条件包括在内,但发现了很多线程错误。所以选项 ti disable the checks 被包括在内,直到错误得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多