in the book that i\'m reading, every example of GUI with multithreading has something like that:
public static void main(String[] args) throws Exception
{
The main thread isn't the same as the EDT. If you add System.out.println(Thread.currentThread().getName() you'll see it print out main within main() and AWT-EventQueue-0 when within the run() method of the Runnable.
Here is a discussion of the history of the single threaded rule in Swing that might help make things clearer.