Causing Deadlocks in Swing Code

This page discusses - Causing Deadlocks in Swing Code,java newsletter,java,tutorial



Causing Deadlocks in Swing

At First Consider the Deadlocks
A 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");
		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 {
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			System.out.println("Calling Dead Lock Method");
			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.