Hello
I have a problem with my program that will stall windows shutdown on some machines.
If the program is minimized it doesn't hang.
Compiled and run with latest java (1.6.0_b26)
EDIT: my first tests were not done correctly I have this program hanging on both XP and Win7 (when the frame is shown)
EDIT: minimal example that exhibits this problem (notice there's no call to addShutdownHook()):
public class ShutdownTest {
public static void main(String[] args) {
Runnable createGUI =new Runnable () {
public void run() {
final JFrame frame = new JFrame("Frame");
final JTextArea comp = new JTextArea
("Try to restart the machine without closing or minimizing this window", 5, 50);
frame.getContentPane().add(comp);
frame.setLocation(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(createGUI);
}
}
Original example: In order to find the problem I've made a little test program that also exhibits this problem:
import javax.swing.*;
import java.awt.*;
public class ShutdownTest {
public static void main(String[] args) {
JFrame frame = new JFrame("Frame");
final JTextArea comp = new JTextArea("Try to restart the machine without closing or minimizing this window");
frame.getContentPane().add(comp);
frame.setLocation(300, 200);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Runtime.getRuntime().addShutdownHook(new ThreadLogger());
}
private static class ThreadLogger extends Thread {
@Override
public void run() {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("Thread logger started");
int numThreads;
do {
numThreads = 0;
try {
System.out.println("Next AWT event:" + Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent());
for (Thread thread : Thread.getAllStackTraces().keySet()) {
// daemon threads will not prevent shutdown
if (!thread.isDaemon()) {
numThreads++;
System.err.println("Stalled thread (" + numThreads + ") : " + thread + ". State: " + thread.getState());
}
}
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
} while (numThreads > 0);
}
};
t.setDaemon(true);
t.start();
System.out.println("Exiting shutdown hook");
}
}
}
After cancelling shutdown the following output is shown:
Exiting shutdown hook
Thread logger started
Next AWT event:java.awt.SentEvent[] on sun.awt.windows.WToolkit@c1b531
Stalled thread (1) : Thread[AWT-EventQueue-0,6,main]. State: WAITING
Stalled thread (2) : Thread[DestroyJavaVM,5,main]. State: RUNNABLE
Stalled thread (3) : Thread[AWT-Shutdown,5,main]. State: WAITING
Next AWT event:java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=javax.swing.Timer$DoPostEvent@1621e42,notifier
=null,catchExceptions=false,when=1310293751906] on sun.awt.windows.WToolkit@c1b531
Stalled thread (1) : Thread[AWT-EventQueue-0,6,main]. State: RUNNABLE
Stalled thread (2) : Thread[DestroyJavaVM,5,main]. State: RUNNABLE
Stalled thread (3) : Thread[AWT-Shutdown,5,main]. State: WAITING
Next AWT event:java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=javax.swing.Timer$DoPostEvent@1621e42,notifier
=null,catchExceptions=false,when=1310293751906] on sun.awt.windows.WToolkit@c1b531
Stalled thread (1) : Thread[AWT-EventQueue-0,6,main]. State: RUNNABLE
Stalled thread (2) : Thread[DestroyJavaVM,5,main]. State: RUNNABLE
Stalled thread (3) : Thread[AWT-Shutdown,5,main]. State: WAITING
Next AWT event:java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=javax.swing.Timer$DoPostEvent@1621e42,notifier
=null,catchExceptions=false,when=1310293751906] on sun.awt.windows.WToolkit@c1b531
Stalled thread (1) : Thread[AWT-EventQueue-0,6,main]. State: RUNNABLE
Stalled thread (2) : Thread[DestroyJavaVM,5,main]. State: RUNNABLE
Stalled thread (3) : Thread[AWT-Shutdown,5,main]. State: WAITING
(this continues indefinitely)
Stack trace:
2011-07-10 11:29:26
Full thread dump Java HotSpot(TM) Client VM (20.1-b02 mixed mode, sharing):
"Thread-4" daemon prio=6 tid=0x04573400 nid=0x7d0 waiting on condition [0x043ef000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at ShutdownTest$ThreadLogger$1.run(ShutdownTest.java:46)
"Thread-1" daemon prio=6 tid=0x04570800 nid=0xdf0 runnable [0x0434f000]
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WToolkit.shutdown(Native Method)
at sun.awt.windows.WToolkit.access$200(Unknown Source)
at sun.awt.windows.WToolkit$2$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
"SIGTERM handler" daemon prio=10 tid=0x0456cc00 nid=0x50c in Object.wait() [0x0425f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x23782888> (a java.lang.Thread)
at java.lang.Thread.join(Unknown Source)
- locked <0x23782888> (a java.lang.Thread)
at java.lang.Thread.join(Unknown Source)
at java.lang.ApplicationShutdownHooks.runHooks(Unknown Source)
at java.lang.ApplicationShutdownHooks$1.run(Unknown Source)
at java.lang.Shutdown.runHooks(Unknown Source)
at java.lang.Shutdown.sequence(Unknown Source)
at java.lang.Shutdown.exit(Unknown Source)
- locked <0x3873b6c0> (a java.lang.Class for java.lang.Shutdown)
at java.lang.Terminator$1.handle(Unknown Source)
at sun.misc.Signal$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
"TimerQueue" daemon prio=6 tid=0x0456a000 nid=0x7e8 in Object.wait() [0x0484f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x237fd038> (a javax.swing.TimerQueue)
at javax.swing.TimerQueue.run(Unknown Source)
- locked <0x237fd038> (a javax.swing.TimerQueue)
at java.lang.Thread.run(Unknown Source)
"DestroyJavaVM" prio=6 tid=0x004a9000 nid=0x7b0 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"AWT-EventQueue-0" prio=6 tid=0x0455d000 nid=0x90c runnable [0x0410e000]
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WInputMethod.getNativeLocale(Native Method)
at sun.awt.windows.WInputMethod.getLocale(Unknown Source)
at sun.awt.windows.WInputMethod.deactivate(Unknown Source)
at sun.awt.im.InputContext.deactivateInputMethod(Unknown Source)
at sun.awt.im.InputContext.focusLost(Unknown Source)
- locked <0x237fc058> (a sun.awt.im.InputMethodContext)
- locked <0x2374e190> (a java.awt.Component$AWTTreeLock)
at sun.awt.im.InputContext.dispatchEvent(Unknown Source)
at sun.awt.im.InputMethodContext.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.SequencedEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
"AWT-Windows" daemon prio=6 tid=0x01a51c00 nid=0xc30 runnable [0x040bf000]
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WToolkit.eventLoop(Native Method)
at sun.awt.windows.WToolkit.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
"AWT-Shutdown" prio=6 tid=0x01a51400 nid=0x5e0 in Object.wait() [0x03fff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x2375a1e8> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at sun.awt.AWTAutoShutdown.run(Unknown Source)
- locked <0x2375a1e8> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
"Java2D Disposer" daemon prio=10 tid=0x01a4ec00 nid=0x4b0 in Object.wait() [0x03f8f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x23762da0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x23762da0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at sun.java2d.Disposer.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
"Low Memory Detector" daemon prio=6 tid=0x019f2c00 nid=0x9d8 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread0" daemon prio=10 tid=0x019e7400 nid=0xe58 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x019e6400 nid=0x114 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x019e5400 nid=0xd38 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x019e0800 nid=0xb40 in Object.wait() [0x03ccf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x23711148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x23711148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
"Reference Handler" daemon prio=10 tid=0x019dbc00 nid=0xb64 in Object.wait() [0x03c7f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x23711048> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
- locked <0x23711048> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x0199f800 nid=0x7c0 runnable
"VM Periodic Task Thread" prio=10 tid=0x01a0e000 nid=0x820 waiting on condition
JNI global references: 1155
Heap
def new generation total 4928K, used 1873K [0x23710000, 0x23c60000, 0x28c60000)
eden space 4416K, 42% used [0x23710000, 0x238e4680, 0x23b60000)
from space 512K, 0% used [0x23b60000, 0x23b60000, 0x23be0000)
to space 512K, 0% used [0x23be0000, 0x23be0000, 0x23c60000)
tenured generation total 10944K, used 0K [0x28c60000, 0x29710000, 0x33710000)
the space 10944K, 0% used [0x28c60000, 0x28c60000, 0x28c60200, 0x29710000)
compacting perm gen total 12288K, used 170K [0x33710000, 0x34310000, 0x37710000)
the space 12288K, 1% used [0x33710000, 0x3373a9e0, 0x3373aa00, 0x34310000)
ro space 10240K, 51% used [0x37710000, 0x37c3dff8, 0x37c3e000, 0x38110000)
rw space 12288K, 55% used [0x38110000, 0x387ac208, 0x387ac400, 0x38d10000)
Edited severeal times to cleanup the post
Edited by: user13397841 on 2011-07-28 04:42
Edited by: Skylla on 2011-08-29 07:43