Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Event Dispatch Thread Hangs, what is wrong?

843806Jun 25 2008
The Event Dispatch Thread Hangs when showing a modal dialog while running a
SwingWorker Thread.

I have included my code at the bottom of the page. There are three classes. I have posted a bug report to red hat. But I want to make sure my code is correct.

My test case just puts the SwingWorker to sleep
but the problem occurs if I do something real, like connect to a database, etc.

Also I have tried little different variations of the logic calling
setVisible(true)/(false) in different places and the same problem occurs.

It seems to work with Sun JDK, note I am using IcedTea with Fedora Core 8.

Version-Release number of selected component (if applicable):
[szakrews@tuxtel ~]$ java -version
java version "1.7.0"
IcedTea Runtime Environment (build 1.7.0-b21)
IcedTea Client VM (build 1.7.0-b21, mixed mode)
How reproducible:

Every couple times.
javac TestClass2
java TestClass2
eventually it will hang. If it doesn't try again.

You don't have to wait for the program to finish either.
The program runs the Dialog 10 times but it never works or fails in the middle, it will either work or fail from the first dialog displayed.

I have included a thread dump. That is about the most informative information I can get. Neither tracing nor writing a custom ThreadQueue or Drawing Manager to trace events produces any helpful information.

Actual results:

The JProccessBar won't move, and the SwingWorker finishes but the done() method is never run. The PROGRAM is not hung however because if I close the dialog then it will continue.

Expected results:

The JProccessBar should always move and the SwingWorker should always run the done() method.

Additional info:

java thread dump after freeze, taken with kill -s SIGQUIT <pid>
2008-06-25 12:25:50
Full thread dump IcedTea Client VM (1.7.0-b21 mixed mode):

"DestroyJavaVM" prio=10 tid=0x938afc00 nid=0x1419 waiting on condition
[0x00000000..0x0018a074]
   java.lang.Thread.State: RUNNABLE

"AWT-EventQueue-0" prio=10 tid=0x938ae400 nid=0x1429 in Object.wait()
[0x07f96000..0x07f96f04]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x96748f80> (a java.awt.EventQueue)
        at java.lang.Object.wait(Object.java:503)
        at java.awt.EventQueue.getNextEvent(EventQueue.java:485)
        - locked <0x96748f80> (a java.awt.EventQueue)
        at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:248)
        at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:201)
        at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:195)
        at java.awt.Dialog$1.run(Dialog.java:1073)
        at java.awt.Dialog$3.run(Dialog.java:1127)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1125)
        at java.awt.Component.show(Component.java:1456)
        at java.awt.Component.setVisible(Component.java:1408)
        at java.awt.Window.setVisible(Window.java:871)
        at java.awt.Dialog.setVisible(Dialog.java:1012)
        at net.xtel.production.WaitDialog.showWaitDialog(WaitDialog.java:72)
        at net.xtel.production.WaitDialog.showWaitDialog(WaitDialog.java:102)
        at TestClass2.showWait(TestClass2.java:79)
        at TestClass2.createAndShowGUI(TestClass2.java:126)
        at TestClass2.access$0(TestClass2.java:114)
        at TestClass2$3.run(TestClass2.java:138)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:227)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:603)
        at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:276)
        at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:201)
        at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:191)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:186)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:178)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:139)

"AWT-Shutdown" prio=10 tid=0x938ad000 nid=0x1428 in Object.wait()
[0x03ea7000..0x03ea7f84]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x96749268> (a java.lang.Object)
        at java.lang.Object.wait(Object.java:503)
        at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:281)
        - locked <0x96749268> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:675)

"AWT-XAWT" daemon prio=10 tid=0x938a8400 nid=0x1423 runnable
[0x02ccc000..0x02ccd104]
   java.lang.Thread.State: RUNNABLE
        at sun.awt.X11.XToolkit.waitForEvents(Native Method)
        at sun.awt.X11.XToolkit.run(XToolkit.java:550)
        at sun.awt.X11.XToolkit.run(XToolkit.java:525)
        at java.lang.Thread.run(Thread.java:675)

"Java2D Disposer" daemon prio=10 tid=0x93854000 nid=0x1421 in Object.wait()
[0x07aea000..0x07aead84]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x966e7010> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        - locked <0x966e7010> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:150)
        at sun.java2d.Disposer.run(Disposer.java:143)
        at java.lang.Thread.run(Thread.java:675)

"Low Memory Detector" daemon prio=10 tid=0x93c15000 nid=0x141f runnable
[0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x93c13400 nid=0x141e waiting on condition
[0x00000000..0x03a8a954]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x93c11c00 nid=0x141d waiting on
condition [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x095e7000 nid=0x141c in Object.wait()
[0x005d2000..0x005d3004]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x966e71d8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        - locked <0x966e71d8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:150)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

"Reference Handler" daemon prio=10 tid=0x095e2400 nid=0x141b in Object.wait()
[0x00581000..0x00582084]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x966e7260> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:134)
        - locked <0x966e7260> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x095dec00 nid=0x141a runnable 

"VM Periodic Task Thread" prio=10 tid=0x93c17400 nid=0x1420 waiting on condition 

JNI global references: 836

Heap
 def new generation   total 960K, used 152K [0x93f40000, 0x94040000, 0x966a0000)
  eden space 896K,   9% used [0x93f40000, 0x93f56148, 0x94020000)
  from space 64K, 100% used [0x94020000, 0x94030000, 0x94030000)
  to   space 64K,   0% used [0x94030000, 0x94030000, 0x94040000)
 tenured generation   total 4096K, used 1088K [0x966a0000, 0x96aa0000, 0xb3f40000)
   the space 4096K,  26% used [0x966a0000, 0x967b01b0, 0x967b0200, 0x96aa0000)
 compacting perm gen  total 12288K, used 9169K [0xb3f40000, 0xb4b40000, 0xb7f40000)
   the space 12288K,  74% used [0xb3f40000, 0xb4834740, 0xb4834800, 0xb4b40000)
No shared spaces configured.
CLASS1:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.RepaintManager;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class TestClass2 extends JFrame implements ActionListener {

        /** Action Command for <code>searchbtn</code> */
        public static final String SEARCH_BTN_ACTION = "search_btn_action";

        /**
         * Constructor.
         */
        public TestClass2() {

                setSize(650, 350);
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                setLocation(screenSize.width / 2 - getSize().width / 2,
                                screenSize.height / 2 - getSize().height / 2);

                setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosing(WindowEvent e) {
                                exit();
                        }
                });

                JPanel panel = new JPanel();
                add(panel);
                setVisible(true);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(SEARCH_BTN_ACTION)) {
                        JOptionPane.showMessageDialog(this, "Button Pressed");
                }
        }

        public void showWait() {
                try {
                        WaitDialog.showWaitDialog(this, "Testing...", new SwingWorkerInterface(){

                                @Override
                                public Object workToDo() throws Throwable {
                                        Thread.currentThread().sleep(3000);
                                        return null;
                                }

                        });
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (ExecutionException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        /**
         * Exits the program.
         */
        public void exit(){
                System.exit(0);
        }

        /**
         * Create the GUI and show it. For thread safety, this method should be
         * invoked from the event-dispatching thread.
         * @throws UnsupportedLookAndFeelException 
         * @throws IllegalAccessException 
         * @throws InstantiationException 
         * @throws ClassNotFoundException 
         * @throws NullInstanceVariableException 
         * @throws SQLException 
         */
        private static void createAndShowGUI() { 

                // set look and feel
                try{
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

                        // Create instance of the ProductCatalog
                        TestClass2 root = new TestClass2();
                        for(int i = 0; i < 10; i++){
                                root.showWait();
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }
        }

        /**
         * @param args
         *            this program does not use arguments
         */
        public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                                createAndShowGUI();
                        }
                });
        }
}
CLASS 2:
import java.awt.Component;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.concurrent.ExecutionException;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class WaitDialog extends JDialog {

        private boolean disposed = false;
        private boolean displayed = false;
        private WorkerThread worker = null;

        WaitDialog(Frame parent, String text, SwingWorkerInterface in){
                super(parent, true);
                worker = new WorkerThread(in);
                setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowOpened(WindowEvent e) {
                                worker.execute();
                        }

                        @Override
                        public void windowClosing(WindowEvent e) {
                                disposeWaitDialog();
                        }
                });

                this.setResizable(false);

                JLabel message = new JLabel();
                message.setText(text);

                JProgressBar pb = new JProgressBar();
                pb.setIndeterminate(true);

                // set size and location
                setSize(200, 100);
                setLocationRelativeTo(parent);

                JPanel panel = new JPanel();
                panel.add(message);
                panel.add(pb);

                add(panel);
        }

        public void showWaitDialog(){

                if(displayed == true){
                        return;
                }

                if(disposed == true){
                        disposed = false;
                        return;
                }

                disposed = false;
                displayed = true;
                setVisible(true);
        }

        public void disposeWaitDialog(){

                if(disposed == true){
                        return;
                }

                if(displayed == true){
                        displayed = false;
                        setVisible(false);
                        return;
                }

                disposed = true;
                displayed = false;
        }

        public static Object showWaitDialog(Component parent, String text, SwingWorkerInterface in) throws InterruptedException, ExecutionException {

                WaitDialog waitDialog = null;
                if (parent == null) {
                        waitDialog = new WaitDialog(JOptionPane.getRootFrame(), text, in);
                } else {
                        waitDialog = new WaitDialog(JOptionPane.getFrameForComponent(parent), text, in);
                }

                while(!waitDialog.worker.isDone()){
                        System.out.println("about to show");
                        waitDialog.showWaitDialog();
                        System.out.println("done showing");
                }

                waitDialog.dispose();
                return waitDialog.worker.get();
        }

        class WorkerThread extends SwingWorker<Throwable, Void> {

                private SwingWorkerInterface in = null;

                WorkerThread(SwingWorkerInterface in){
                        this.in = in;
                }

                public Throwable doInBackground(){
                                try {
                                        System.out.println("about to do work");
                                        in.workToDo();
                                        System.out.println("done work no exception");
                                } catch (Throwable e) {
                                        System.out.println("done work with exception");
                                        return e;
                                }
                                return null;
                        }

                public void done(){
                                System.out.println("about to dispose");
                                disposeWaitDialog();
                                System.out.println("disposed");
                }
        }
}
CLASS 3:
public interface SwingWorkerInterface {
        public Object workToDo() throws Throwable;
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jul 23 2008
Added on Jun 25 2008
0 comments
569 views