多个事件调度线程导致Java Web Start应用程序死锁
我正在编写一个JavaWebStart应用程序,我观察到它冻结了。在执行线程转储时,可以看到死锁中涉及的两个线程都是事件调度线程 当我在本地运行应用程序时,只有一个EDT,但当我下载并通过JavaWebStart运行时,还有第二个EDT 有人能告诉我为什么会有第二次EDT,我如何才能防止他们彼此僵持 编辑:在使用JVisualVM监视应用程序之后,我认为第二个EDT负责重新绘制java控制台窗口多个事件调度线程导致Java Web Start应用程序死锁,java,multithreading,java-web-start,event-dispatch-thread,Java,Multithreading,Java Web Start,Event Dispatch Thread,我正在编写一个JavaWebStart应用程序,我观察到它冻结了。在执行线程转储时,可以看到死锁中涉及的两个线程都是事件调度线程 当我在本地运行应用程序时,只有一个EDT,但当我下载并通过JavaWebStart运行时,还有第二个EDT 有人能告诉我为什么会有第二次EDT,我如何才能防止他们彼此僵持 编辑:在使用JVisualVM监视应用程序之后,我认为第二个EDT负责重新绘制java控制台窗口 Found one Java-level deadlock: ===================
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级死锁:
=============================
“AWT-EventQueue-1”:
等待锁定监视器0x07e4d8fc(对象0x29c2d950,一个java.awt.Component$AWTTreeLock),
由“AWT-EventQueue-0”持有
“AWT-EventQueue-0”:
等待锁定监视器0x07e4cbfc(对象0x29c294e8,一个java.lang.StringBuilder),
由“AWT-EventQueue-1”持有
上面列出的线程的Java堆栈信息:
===================================================
“AWT-EventQueue-1”:
位于java.awt.Window.getOpacity(未知源)
-等待锁定(java.awt.Component$AWTTreeLock)
位于sun.awt.SunToolkit.isContainingTopLevel半透明(未知源)
在sun.awt.windows.WComponentPeer.isaccessable(未知源)
位于sun.java2d.d3d.D3DSurfaceData$D3DWindowSurfaceData.restoreSurface(未知源)
位于sun.java2d.d3d.D3DScreenUpdateManager.validate(未知源)
位于sun.java2d.d3d.D3DScreenUpdateManager.createGraphics(未知源)
位于sun.awt.windows.WComponentPeer.getGraphics(未知源)
位于java.awt.Component.getGraphics(未知源代码)
位于javax.swing.JFrame.getGraphics(未知源代码)
位于javax.swing.JComponent.safelyGetGraphics(未知源代码)
-锁定(java.lang.StringBuilder)
在javax.swing.repaitmanager$3.run(未知源代码)
...
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
“AWT-EventQueue-0”:
位于javax.swing.JComponent.isComponentToBainingGraphicsFrom(未知源)
-等待锁定(java.lang.StringBuilder)
位于javax.swing.JComponent.getGraphicsInvoke(未知源)
位于javax.swing.JFrame.getGraphics(未知源代码)
...
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
您认为AWT-EventQueue-0
是您的正常事件线程,而AWT-EventQueue-1
是通过Java web start启动应用程序时创建的线程,这是正确的。(实际上,如果您的web start应用程序不显示控制台,您会发现第二个控制台是创建的。)
至于死锁的原因,不可能不看到两个线程的完整堆栈跟踪,但是有一些可能性(以估计的概率递减顺序!):
- 你的视频驱动程序中有一个bug
- 代码中的错误
- JDK中的一个bug
好运可能是:不。如果你问的是@assylias,我不会创建自己的EDT