4

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)
4

2 に答える 2

1

AWT-EventQueue-0これは通常のイベント スレッドでありAWT-EventQueue-1、アプリケーションが Java Web Start を介して開始されたときに作成されるスレッドであることは間違いありません。(実際には、Web 開始アプリケーションがコンソールを表示しない場合、2 番目のものが作成されることがわかります。)

デッドロックの原因については、2 つのスレッドの完全なスタック トレースを確認せずに判断することはできませんが、いくつかの可能性があります (推定確率の降順で!)。

  • ビデオドライバーのバグ
  • コードのバグ
  • JDK のバグ
于 2013-06-28T09:29:53.110 に答える