I was expecting the 'run' method of the Thread class to run (which won't print anything) and not the run method of TestThread4; in fact I'm running the 'run' method on a new Thread instance....
The run() method of the Thread class, actually does stuff. It is called by the new thread that is created by the start() method. And if you don't override it, the run() method looks for a runnable object that has been passed to the Thread object via the constructor and call its run() method.
In this case, your main thread called it directly, but it still does the same thing -- look for the runnable passed via the constructor and call its run() method.
Henry