2010-09-16 2 views
3

Мы столкнулись с необычным тупиком во время запуска нашего приложения 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) 
     ... 

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

+0

Я читаю это право, что два вызова 'Component.setFont' происходят за пределами потока отправки событий? Являются ли они результатом вашего кода? – kschneid

+0

Да, они были ... Я заметил это после того, как я опубликовал первоначальный вопрос. Наверное, у меня были свои шторы, когда я впервые прочитал трассу. Вы можете увидеть мой ответ ниже. –

ответ

3

Я не уверен, как я это пропустил, но если бы я немного прочитал трассировку стека, я бы обнаружил, что проблема в том, что статическая инициализация класса 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)