我目前正在尝试调试同时使用 JavaFX 和 Swing 的中等规模(大约数千行)Java 项目,并且我经常遇到一些奇怪的异常,我很确定因为没有在正确的线程上调用 UI 代码。这些异常的堆栈跟踪根本没有用,因为它们几乎都源自 UI 绘图线程。
现在,我当然可以坐下来用梳子调试每个 UI 调用,直到找到一个未在正确线程上调用的调用,然后在整个项目中继续这样做,但那将是一项极其漫长的任务。有没有更简单的方法来进行这种调试?例如,以某种方式导致 UI 代码在未从相应线程调用时打印出调试消息或抛出异常?
最佳答案
在同一线程上运行 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 - 定位不在平台/调度线程上的 UI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674514/