2010-05-07 179 views
1

我正在使用Swing前端编写基本的Java应用程序。基本上它通过Apache Cayenne从Derby数据库加载一些数据,然后将其显示在JTable中。我正在Eclipse中进行开发,我不认为这很重要,但我使用Maven进行依赖。Java Swing应用程序在正常模式下运行时挂起,但在调试模式下运行正常

现在这工作正常,当我运行调试但它似乎挂起显示线程时,我使用运行按钮。我做了一个线程转储,我不是100%确定的,但一切看起来不错。我使用Java VisualVM,并且线程在那里看起来很好。

奇怪它似乎间歇性地工作。虽然很容易重现,但它非常一致。如果任何人有任何想法,我都摆脱了他们。

回答

5

它不应该是一个问题,你正在使用Maven或Eclipse的Swing应用程序。我们一直这样做,没有任何问题。你说你不是100%,所有的线程都看起来不错,所以发布你的线程会很有用,特别是当你的应用程序被挂起时 - 这可能会导致死锁。

事实上,你说它间歇发生,导致我相信这是一个线程问题。运行调试器可能会导致线程以不同的方式运行,这就是为什么它可能在调试模式下工作。 Swing线程问题通常是由于不在事件分派线程上执行GUI更新而导致的,因为Swing不是线程安全的。任何直接或间接更新摆动组件的操作(意味着它更新表格模型,然后更新表格)必须在事件调度线程上完成

如果您可以缩小正在调用的代码块当应用程序冻结时,你应该发布,如果可以的话,这也会有所帮助。

+1

+1用于事件分派线程。我还建议将默认外观切换到Substance(https://substance.dev.java.net/),这会强制*在EDT中执行Swing相关的任务,或者应用程序失败。这对我来说很有用,用于调试。 – 2010-05-07 02:12:56

+0

甜 - 我意识到不同的方式来检查EDT违规,但不知道有一个外观和感觉会做到这一点。 – 2010-05-07 02:42:26

+0

虽然我可能不会依赖L&F来强制执行,因为这个想法是L&F可以插入。对我来说,这听起来像是对外观和感觉的责任的侵犯...... – 2010-05-07 02:54:49

相关问题