Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个事件调度线程导致Java Web Start应用程序死锁_Java_Multithreading_Java Web Start_Event Dispatch Thread - Fatal编程技术网

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

多个事件调度线程导致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: ===================

我正在编写一个JavaWebStart应用程序,我观察到它冻结了。在执行线程转储时,可以看到死锁中涉及的两个线程都是事件调度线程

当我在本地运行应用程序时,只有一个EDT,但当我下载并通过JavaWebStart运行时,还有第二个EDT

有人能告诉我为什么会有第二次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级死锁:
=============================
“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

我们必须找到一个与您的问题非常相似的问题

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

只有在玩游戏机时,我们才能看到第二次EDT的活动 窗口(调整大小/隐藏)。 不断调整大小使问题很容易重现

经过一段时间的搜索,我们可以在代码中找到一个在paint方法中调用getGraphics的地方。这触发了一系列调用,这些调用在所有组件的最顶端结束 它似乎与此控制台共享

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

希望这有帮助。 我对这个mistery共享组件的任何其他细节都感兴趣

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


好运

可能是:不。如果你问的是@assylias,我不会创建自己的EDT