0

Swing アプリがあります。問題は、Windows 7シャットダウンできないことです - メッセージ「まだバックグラウンドで実行中のプログラムがあります」が表示され、Windows をシャットダウンする唯一の方法は、強制ボタンを押すことです。

shutdownHook ハンドラーがあり、強制終了する必要があるすべてのものを強制終了しますが... また、プロファイラーはネイティブJVMメソッドで 2 つのデッドロックを示します。

AWT-EventQueue-0 <--- Frozen for at least 12s
sun.awt.windows.WComponentPeer.nativeHandleEvent(AWTEvent)
sun.awt.windows.WComponentPeer.handleEvent(AWTEvent)
sun.awt.windows.WWindowPeer.handleEvent(AWTEvent)
java.awt.Component.dispatchEventImpl(AWTEvent)
java.awt.Container.dispatchEventImpl(AWTEvent)
java.awt.Window.dispatchEventImpl(AWTEvent)
java.awt.Component.dispatchEvent(AWTEvent)
java.awt.KeyboardFocusManager.redispatchEvent(Component, AWTEvent)
java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Component, AWTEvent)
java.awt.DefaultKeyboardFocusManager.dispatchEvent(AWTEvent)
java.awt.Component.dispatchEventImpl(AWTEvent)
java.awt.Container.dispatchEventImpl(AWTEvent)
java.awt.Window.dispatchEventImpl(AWTEvent)
java.awt.Component.dispatchEvent(AWTEvent)
java.awt.EventQueue.dispatchEventImpl(AWTEvent, Object)
java.awt.EventQueue.access$400(EventQueue, AWTEvent, Object)
java.awt.EventQueue$2.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext)
java.awt.EventQueue$3.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.awt.EventQueue.dispatchEvent(AWTEvent)
java.awt.SentEvent.dispatch()
java.awt.DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent.dispatch()
java.awt.DefaultKeyboardFocusManager.sendMessage(Component, AWTEvent)
java.awt.DefaultKeyboardFocusManager.dispatchEvent(AWTEvent)
java.awt.Component.dispatchEventImpl(AWTEvent)
java.awt.Container.dispatchEventImpl(AWTEvent)
java.awt.Window.dispatchEventImpl(AWTEvent)
java.awt.Component.dispatchEvent(AWTEvent)
java.awt.EventQueue.dispatchEventImpl(AWTEvent, Object)
java.awt.EventQueue.access$400(EventQueue, AWTEvent, Object)
java.awt.EventQueue$2.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext)
java.awt.EventQueue$3.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.awt.EventQueue.dispatchEvent(AWTEvent)
java.awt.SequencedEvent.dispatch()
java.awt.EventQueue.dispatchEventImpl(AWTEvent, Object)
java.awt.EventQueue.access$400(EventQueue, AWTEvent, Object)
java.awt.EventQueue$2.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext)
java.awt.EventQueue$3.run()<2 recursive calls>
java.security.AccessController.doPrivileged(PrivilegedAction, AccessControlContext)
java.security.AccessControlContext$1.doIntersectionPrivilege(PrivilegedAction, AccessControlContext, AccessControlContext)
java.awt.EventQueue.dispatchEvent(AWTEvent)
java.awt.EventDispatchThread.pumpOneEventForFilters(int)
java.awt.EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter)
java.awt.EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component)
java.awt.EventDispatchThread.pumpEvents(int, Conditional)
java.awt.EventDispatchThread.pumpEvents(Conditional)
java.awt.EventDispatchThread.run()



Thread-1 <--- Frozen for at least 12s
sun.awt.windows.WToolkit.shutdown()
sun.awt.windows.WToolkit.access$200(WToolkit)
sun.awt.windows.WToolkit$2$1.run()
java.lang.Thread.run()

何が原因かわかる人いますか?

4

1 に答える 1

2

SwingUtilities.invokeAndWaitシャットダウン フックを呼び出すと、デッドロックが発生します。同様に、新しいウィンドウを表示しようとした場合。おそらくほとんどの GUI アクセスは危険です。のドキュメントからaddShutdownHook

たとえば、AWT イベント ディスパッチ スレッドなど、他のスレッドベースのサービスを使用しようとすると、デッドロックが発生する可能性があります。

シャットダウンフックのコードを見ると役立つかもしれませんが、それが起こっていると思います。あなたが「殺す」必要があるのは何ですか?

于 2013-10-22T13:34:23.740 に答える