Java Web Start アプリケーションを作成していますが、フリーズしました。スレッド ダンプを実行すると、デッドロックに関係する 2 つのスレッドが両方ともイベント ディスパッチ スレッドであることがわかります。
アプリをローカルで実行すると、EDT は 1 つしかありませんが、Java Web Start をダウンロードして実行すると、もう 1 つ存在します。
2 番目の EDT がある理由と、それらが互いにデッドロックするのを防ぐにはどうすればよいか教えてもらえますか?
編集: JVisualVM を使用してアプリを監視した後、2 番目の 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)