title: Thread-safe problem of the java GUI creation
body: <p>In the following <a href="http://download.oracle.com/javase/tutorial/uiswing/examples/components/TopLevelDemoProject/src/components/TopLevelDemo.java" rel="nofollow">sample code</a>, </p>
  
  <pre><code>/*
   * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   *   - Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   *
   *   - Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   *
   *   - Neither the name of Oracle or the names of its
   *     contributors may be used to endorse or promote products derived
   *     from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */ 
  
  package components;
  
  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  
  /* TopLevelDemo.java requires no other files. */
  public class TopLevelDemo {
      /**
       * Create the GUI and show it.  For thread safety,
       * this method should be invoked from the
       * event-dispatching thread.
       */
      private static void createAndShowGUI() {
          //Create and set up the window.
          JFrame frame = new JFrame("TopLevelDemo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
          //Create the menu bar.  Make it have a green background.
          JMenuBar greenMenuBar = new JMenuBar();
          greenMenuBar.setOpaque(true);
          greenMenuBar.setBackground(new Color(154, 165, 127));
          greenMenuBar.setPreferredSize(new Dimension(200, 20));
  
          //Create a yellow label to put in the content pane.
          JLabel yellowLabel = new JLabel();
          yellowLabel.setOpaque(true);
          yellowLabel.setBackground(new Color(248, 213, 131));
          yellowLabel.setPreferredSize(new Dimension(200, 180));
  
          //Set the menu bar and add the label to the content pane.
          frame.setJMenuBar(greenMenuBar);
          frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
  
          //Display the window.
          frame.pack();
          frame.setVisible(true);
      }
  
      public static void main(String[] args) {
          //Schedule a job for the event-dispatching thread:
          //creating and showing this application's GUI.
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  createAndShowGUI();
              }
          });
      }
  }
  </code></pre>
  
  <p>The comment above the function createAndShowGUI(), "For thread safety, this method should be invoked from the event-dispatching thread.". </p>
  
  <p>Could you explain why this method should be invoked from the event-dispatching thread. I have tried to put this method in the public void main method, but it does not matter. </p>