Hi Artem,

I tried to slightly change your patch. The problem with checking for
> isInterrupted() in EDT.run(), as well as for threadDeathCaught, is that the
> thread will never be marked free in AWTAutoShutdown. To fix that, we should
> make EQ.detachDispatchThread() unconditional, so it always detaches the
> thread, but this would lead to the very next postEvent() will initialize a
> new dispatch thread...


In this case we would be lucky, as EventQueue.initDispatchThread()
explicitly checks wether its AppContext is beeing disposed :)



> What if somebody calls EDT.stop() directly, without preceding interrupt()?
> I understand this is not a typical scenario, and we probably shouldn't
> support it, but we should at least not hang.
>

Right, if there are events left in the queue to be dispatched, it would
simply hang.

I'll prepare two patches, a less-intrusive one which simply restores the
pre-java.util.concurrent behaviour (which still will spin between
interrupt() and stop() if events are left to be dispatched), and another one
that will try to deal with the situation in a clean way, as David suggested.

I somehow believe the isInterrupted() checks were intended as "if
interrupt() has been called for this thread", instead they mean "if
interrupt() has been called, but no InterruptedException has been thrown".
Wouldn't make much sence otherwise.

Thanks, Clemens

Reply via email to