Странный дамп потока в тупиковой ситуации

Мы столкнулись со странным тупиком во время запуска нашего Java-приложения. Когда я запускаю jstack в приложении для исследования, я вижу, что AWT-EventQueue находится в Object.wait(), но поток по-прежнему помечен как RUNNABLE. Я включил соответствующие части дампа потока и надеюсь, что кто-то сможет пролить свет на эту проблему.

"AWT-EventQueue-0" prio=6 tid=0x5f0a2400 nid=0x19e4 in Object.wait() [0x6007e000]
       java.lang.Thread.State: RUNNABLE
        at com.ge.med.platinum.work.isu.ExamTransaction.getEAOTableLite(ExamTransaction.java:1514)
          ...
          - locked <0x1fc87448> (a java.awt.Component$AWTTreeLock)
          ...

"Thread-63-Pool-9" prio=6 tid=0x5f1a2800 nid=0x1f54 waiting for monitor entry [0x61a9f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.awt.Component.setFont(Component.java:1777)
    - waiting to lock <0x1fc87448> (a java.awt.Component$AWTTreeLock)
      ...

"Thread-289-Pool-3" prio=6 tid=0x60afe800 nid=0x12b8 waiting for monitor entry [0x623fe000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.awt.Component.setFont(Component.java:1777)
    - waiting to lock <0x1fc87448> (a java.awt.Component$AWTTreeLock)
      ...

Кроме того, я заметил эту ветку, в которой упоминается что может быть задействован доступ к статической переменной. Это также имеет место в нашем приложении. Рассматриваемая строка в getEAOTableLite ссылается на статический метод.


person Ryan Gross    schedule 16.09.2010    source источник
comment
Правильно ли я понимаю, что два вызова Component.setFont происходят вне потока диспетчеризации событий? Это результат вашего кода?   -  person kschneid    schedule 16.09.2010
comment
Да, они были ... Я заметил это после того, как разместил первоначальный вопрос. Я предполагаю, что у меня были шоры, когда я читал след в первый раз. Вы можете увидеть мой ответ ниже.   -  person Ryan Gross    schedule 16.09.2010


Ответы (2)


Я не уверен, как я это пропустил, но если бы я прочитал трассировку стека немного лучше, я бы обнаружил, что проблема заключается в том, что статическая инициализация класса EAOAlertManager в конечном итоге вызовет Component.setFont() метод, который был заблокирован AWT-EventQueue (незаконно вызывать setFont() вне EventQueue). Затем EventQueue вернулась обратно в ExamTransaction.getEAOTableLite, что означало, что она снова будет ссылаться на класс EAOAlertManager, заставляя ожидать завершения загрузки класса. Но класс EAOAlertManager ждал в EventQueue. Это, друзья мои, тупик.

"Thread-289-Pool-3" prio=6 tid=0x60afe800 nid=0x12b8 waiting for monitor entry [0x623fe000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.awt.Component.setFont(Component.java:1777)
    - waiting to lock <0x1fc87448> (a java.awt.Component$AWTTreeLock)
    at java.awt.Container.setFont(Container.java:1554)
    at javax.swing.JComponent.setFont(JComponent.java:2723)
    at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:191)
    at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:49)
    at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:39)
    at com.ge.med.ptk.laf.CuiPanelUI.installUI(CuiPanelUI.java:53)
    at javax.swing.JComponent.setUI(JComponent.java:662)
    at javax.swing.JPanel.setUI(JPanel.java:136)
    at javax.swing.JPanel.updateUI(JPanel.java:109)
    at javax.swing.JPanel.<init>(JPanel.java:69)
    at javax.swing.JPanel.<init>(JPanel.java:92)
    at javax.swing.JPanel.<init>(JPanel.java:100)
    at javax.swing.JRootPane.createGlassPane(JRootPane.java:528)
    at javax.swing.JRootPane.<init>(JRootPane.java:348)
    at javax.swing.JDialog.createRootPane(JDialog.java:611)
    at javax.swing.JDialog.dialogInit(JDialog.java:593)
    at com.ge.med.plaf.wrapper.WJDialog.dialogInit(WJDialog.java:42)
    at javax.swing.JDialog.<init>(JDialog.java:545)
    at javax.swing.JDialog.<init>(JDialog.java:515)
    at com.ge.med.plaf.wrapper.WJDialog.<init>(WJDialog.java:424)
    at com.ge.med.platinum.gui.util.PlatinumDialog.<init>(PlatinumDialog.java:138)
    at com.ge.med.platinum.gui.util.EAOAlertManager$EAOAlertDialog.<init>(EAOAlertManager.java:450)
    at com.ge.med.platinum.gui.util.EAOAlertManager.<clinit>(EAOAlertManager.java:77)
    at com.ge.med.platinum.work.isu.ExamTransaction.getEAOTableLite(ExamTransaction.java:1514)
person Ryan Gross    schedule 16.09.2010

Эта статья, кажется, попадает прямо в точку: http://www.javaworld.com/javaworld/jw-04-1999/jw-04-toolbox.html Всего 5 страниц. Я не знаю, что все это значит для вашего приложения, но это должно вам помочь.

person luther07    schedule 16.09.2010