Thread group disposal question
Artem Ananiev
Artem.Ananiev at Sun.COM
Fri Aug 22 04:43:17 PDT 2008
Hi, David,
see my comments below.
David Holmes - Sun Microsystems wrote:
> Just in case it was unclear what Martin was referring to, an AppContext
> has a ThreadGroup associated with it and when the AppContext is disposed
> it tries to terminate all the threads in its ThreadGroup by calling
> first Thread.interrupt() (safe) and then Thread.stop() (perilous).
>
> The Thread.stop() is unreliable and completely dangerous. There is no
> way for an AppContext to force threads within it to terminate on demand.
>
> That said, I don't think that is the cause of the hang. The most suspect
> part of that thread dump is this:
>
> "AWT-EventQueue-83" prio=6 tid=0x33e6e400 nid=0x1e0 in Object.wait()
> [0x3b77f000..0x3b77fb94]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x038c01a8> (a java.awt.EventQueue$1AWTInvocationLock)
> at java.lang.Object.wait(Object.java:485)
> at java.awt.EventQueue.invokeAndWait(EventQueue.java:992)
> - locked <0x038c01a8> (a java.awt.EventQueue$1AWTInvocationLock)
> at java.awt.Window.doDispose(Window.java:994)
> at java.awt.Window.dispose(Window.java:937)
> at
> javax.swing.SwingUtilities$SharedOwnerFrame.dispose(SwingUtilities.java:1789)
>
> at
> javax.swing.SwingUtilities$SharedOwnerFrame.windowClosed(SwingUtilities.java:1767)
>
> - locked <0x04942ed0> (a java.awt.Component$AWTTreeLock)
>
> Here we have an AWT event thread calling EventQueue.invokeAndWait()
> (which would only make sense if it were calling it on a different
> EventQueue - which perhaps it is) *BUT* it does it while holding the
> global AWTTreeLock. Seems like a prime candidate for a deadlock to me.
> And you will see that there's a following event queue thread blocked
> trying to acquire that lock:
>
> "AWT-EventQueue-81" prio=6 tid=0x349c7400 nid=0xbdc waiting for monitor
> entry [0x3bf7f000..0x3bf7fd14]
> java.lang.Thread.State: BLOCKED (on object monitor)
> at java.awt.Component.invalidate(Component.java:2622)
> - waiting to lock <0x04942ed0> (a java.awt.Component$AWTTreeLock)
Agree with you, this is definitely a problem, and I will try to resolve
it somehow. There is another thing which looks odd to me: stack trace
shows a number of AWT-EventQueue-XX threads alive. Several event
dispatch threads may only appear if several AppContexts exist, so I
assume no AppContext is correctly disposed (and no corresponding
ThreadGroup is destroyed). I wonder if this may be caused by:
> The Thread.stop() is unreliable and completely dangerous. There is no
> way for an AppContext to force threads within it to terminate on demand.
There is one more idea I'm going to check. It's a known fact that AWT
recreates its event dispatch thread if the previous one was destroyed
for some reason (for example, because of uncaught exception). Now
consider the following situation: when AppContext and its ThreadGroup
are being destroyed, any incoming event leads to a new dispatch thread
created, which in turn prevents the ThreadGroup from destroying.
Thanks,
Artem
> I'd redirect this to the AWT folk.
>
> Cheers,
> David Holmes
>
>
> Martin Buchholz said the following on 08/22/08 08:22:
>> Hi Artem,
>>
>> Please read
>> http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
>>
>> The deprecated Thread methods are inherently deadlock-prone.
>>
>> I don't know how AWT is supposed to work, but other folks
>> have had the same kind of threading reliability problems.
>> Perhaps someone from awt-dev would know better - I would try there.
>>
>> Martin
>>
>> On Thu, Aug 21, 2008 at 6:26 AM, Artem Ananiev <Artem.Ananiev at sun.com>
>> wrote:
>>> Hi, hotspot team,
>>>
>>> (I'm not sure if hotspot-runtime-dev is a right alias for the
>>> questions like
>>> this, but I haven't found anything better)
>>>
>>> my question is about the right way to destroy a Thread or
>>> ThreadGroup. In a
>>> few words, some application periodically creates and destroys
>>> instances of
>>> sun.awt.AppContext (which roughly corresponds to a ThreadGroup
>>> instance).
>>> After a small number of iterations application just hangs - the stack
>>> trace
>>> is attached.
More information about the hotspot-runtime-dev
mailing list