Causing Deadlocks in Swing
At First Consider the DeadlocksA deadlock is a situation where two or more competing process or action waiting for a single resources and each waiting to let others to finish. And none of them uses that resources. It is a common problem in multithreading.
Consider the Sample code given below the frame is being constructed by the static block and by adding the new DesktopPain to the Content Pain it starts the Swing Thread . But the JInternalFrame is also started with main Thread at the Same Time. The Swing Thread tries to call the paintComponent method. Then it hangs by calling the static method.
Consider The Code
import java.awt.Graphics; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.SwingUtilities; public class DeadLockClaz extends JFrame { private DeadLockClaz() { getContentPane().add(new DesktopPainClaz()); setSize(400, 200); setTitle("DeadLock Example"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); new JInternalFrame(); } // Static Block static { new DeadLockClaz(); } // Inner Private Class private static void myDeadlockMethod() { System.out.println("Dead Lock Occured"); } private class DesktopPainClaz extends JDesktopPane { @Override protected void paintComponent(Graphics g) { // TODO Auto-generated method stub super.paintComponents(g); System.out.println("Calling Dead Lock Method"); myDeadlockMethod(); System.out.println("The Dead Lock is Called"); } } public static void main(String[] args) { } }
The main point to cause a deadlock is by calling a static from other thread, before static block is finished. However you can fix the code very easily, for example call the setVisible(true) method just after the returning the new JInternalFrame();. But one thing you can do to change our static block. The code given below will fix above deadlock problem.
static { SwingUtilities.invokeLater(new Runnable() { public void run() { new DeadLockClaz(); } }); }So while writing the GUI component in Swing be sure that only the swing thread is changing or reading the GUI.