In my application, some process that is started in AWT’s Event Dispatching Thread (EDT) may be interrupted under particular circumstances. Then it waits for input from the user. Alas, as the process is located in the EDT, the whole application freezes and the user is unable to relaunch the process, thus creating a deadlock. Is there any way to interrupt the EDT and lauch a new event pump from another thread ? Then the user would be able to interact with the UI.
What I am trying to do looks more or less like opening a modal dialog, except that I don’t want a dialog because my component is complex. I’d rather display it right inside my root pane. So I had a look at how it’s done in java.awt.Dialog, and had a pretty good understanding of it, but the most important classes that are used (EventDispatchThread, SequencedEvent, …) are protected and therefore inaccessible for me.
Thank you all for your answers.
I’ll be more specific. I am actually working on an application which embeds a homegrown scripting language. I am developing a debugger for this language. The debugger (as all debuggers) would stop the script execution whenever a breakpoint is met. The scripted processes can be triggered from many places (including from the EDT) in the code so taking the the process out of the EDT is not an option. I’d like the debugger UI to be embedded in the application (in a side pane to be precise). So when a breakpoint is met I would need the current thread (possibly the EDT, not to say mainly) to be interrupted and at least the debugger’s UI should still be responsive. Also I am developing atop of the JDK 1.4 so no way to use JDK7 alas.
What I am currently doing is opening a JDialog with the debugger embedded. It all works fine but as I said I am not fully satisfied by this solution because I would really want my debugger to be embedded right in my main window.
If you are using JDK7, you can use the
SecondaryLoopinterface. An instance of this interface can be created through theEventQueue.createSecondaryLoopmethodThere was an informative blog post with an example but the server seems to be offline for the moment.
A small edit as I am still not fully sure I understand your question.
If you want to wait for user input from a worker thread, you can use the
SwingUtilities.invokeAndWaitmethod and use a blocking method (e.g. show aJOptionPaneto retrieve user input). Due to theinvokeAndWaityour worker thread will be stopped until theRunnableon the EDT is processed. If you use a blocking method on the EDT to retrieve the user input thatRunnablewill only be finished when the user has provided his/her input