java - 多个事件调度线程在 Java Web Start 应用程序中导致死锁

标签 java multithreading java-web-start event-dispatch-thread

我正在编写一个 Java Web Start 应用程序,我发现它卡住了。当我进行线程转储时,我可以看到死锁中涉及的两个线程都是事件调度线程。

当我在本地运行应用程序时,只有一个 EDT,但是当我下载并通过 Java Web Start 运行时,会有第二个。

谁能告诉我为什么会有第二个 EDT,我怎样才能防止它们彼此死锁?

编辑:在使用 JVisualVM 监控应用程序后,我相信第二个 EDT 负责重绘 java 控制台窗口。

Found one Java-level deadlock:
=============================
"AWT-EventQueue-1":
  waiting to lock monitor 0x07e4d8fc (object 0x29c2d950, a java.awt.Component$AWTTreeLock),
  which is held by "AWT-EventQueue-0"
"AWT-EventQueue-0":
  waiting to lock monitor 0x07e4cbfc (object 0x29c294e8, a java.lang.StringBuilder),
  which is held by "AWT-EventQueue-1"


Java stack information for the threads listed above:
===================================================
"AWT-EventQueue-1":
    at java.awt.Window.getOpacity(Unknown Source)
    - waiting to lock <0x29c2d950> (a java.awt.Component$AWTTreeLock)
    at sun.awt.SunToolkit.isContainingTopLevelTranslucent(Unknown Source)
    at sun.awt.windows.WComponentPeer.isAccelCapable(Unknown Source)
    at sun.java2d.d3d.D3DSurfaceData$D3DWindowSurfaceData.restoreSurface(Unknown Source)
    at sun.java2d.d3d.D3DScreenUpdateManager.validate(Unknown Source)
    at sun.java2d.d3d.D3DScreenUpdateManager.createGraphics(Unknown Source)
    at sun.awt.windows.WComponentPeer.getGraphics(Unknown Source)
    at java.awt.Component.getGraphics(Unknown Source)
    at javax.swing.JFrame.getGraphics(Unknown Source)
    at javax.swing.JComponent.safelyGetGraphics(Unknown Source)
    - locked <0x29c294e8> (a java.lang.StringBuilder)
    at javax.swing.RepaintManager$3.run(Unknown Source)
...
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
"AWT-EventQueue-0":
    at javax.swing.JComponent.isComponentObtainingGraphicsFrom(Unknown Source)
    - waiting to lock <0x29c294e8> (a java.lang.StringBuilder)
    at javax.swing.JComponent.getGraphicsInvoked(Unknown Source)
    at javax.swing.JFrame.getGraphics(Unknown Source)
...
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

我们只需要找到一个与您的问题非常相似的问题即可。

我们的发现: Java Webstart 正在触发多个 EDT 线程的创建。如果你开始 您的小程序作为应用程序只有一个 EDT 可以防止出现问题。

只有当我们使用控制台时,我们才能在第二个 EDT 上看到 Activity 窗口(调整大小/隐藏)。 不断调整大小使得问题很容易重现。

经过一番搜索后,我们可以在代码中找到在 paint 方法中调用 getGraphics 的位置。这触发了一系列调用,结束于所有组件的最顶部 似乎与此控制台共享。

当应用程序和控制台打开并且用户解锁电脑时,很可能会发生这种情况,因为所有组件都会同时重绘。

希望这对您有所帮助。 我对有关此神秘共享组件的任何其他详细信息感兴趣。

就我个人而言,我不怀疑控制台与主应用程序共享一个可以通过这种方式相互锁定的组件。

祝你好运

关于java - 多个事件调度线程在 Java Web Start 应用程序中导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16818863/

相关文章:

java - 正则表达式 java 运算符

java - 用Java获取MSG Outlook文件的原始内容(字符串格式)

java - 剪耳三角器崩溃

multithreading - 从线程修改QGraphicsItem的正确方法?

java - 使用 JPQL 通过 UCanAccess 驱动程序查询 MS-Access 数据库

python - Python 中的多线程可打开数千个 url 并更快地处理它们

c++ - P线程问题

java - 通过JNLP写入本地文件

Java Web Start - 运行时出现 ClassNotFoundException

Java Web Start 控制台消失